【问题标题】:Fluent nHibernate Join流畅的 nHibernate 加入
【发布时间】:2011-06-14 22:14:23
【问题描述】:

我有一个映射到名为 Rule 的表的实体。该实体的表具有另一个名为 Category 的表的 FK。我试图弄清楚如何从我的 Rule 实体中的 Category 中提取属性。我很确定我想在我的实体映射中使用连接,但我不知道如何配置它以使其工作。这是我的映射:

Join("Category", x => 
{
    x.Map(i => i.CategoryName, "Name");
    x.KeyColumn("CategoryId");
    x.Inverse();
});

这是它生成的 SQL...

SELECT ...
FROM Rule rules0_ left outer join Category rules0_1_ on rules0_.Id=rules0_1_.CategoryId
WHERE ...

这是我想要的 SQL。

SELECT ...
FROM Rule rules0_ left outer join Category rules0_1_ on rules0_.CategoryId=rules0_1_.Id
WHERE ...

我似乎在 JoinPart 上找不到任何可以让我这样做的东西。从我找到的少量文档来看,Subselect 看起来很有希望,但我找不到任何如何使用它的示例。对此问题的任何建议将不胜感激。谢谢!

【问题讨论】:

    标签: c# nhibernate join fluent-nhibernate fluent-nhibernate-mapping


    【解决方案1】:

    “加入”的名字很糟糕。 NHibernate 映射中的“连接”意味着基于两个表的主键关系的零对一关系。例如,如果您有一个 User 表和一个 UserAdditionalInfo 表,每个 User 有 0 条或 1 条记录,您将使用联接。 UserAdditionalInfo 表可能会引用来自 User 的 PK 作为外键和它自己的主键。当 DBA 必须虔诚地为旧版应用程序维护架构时,这种类型的事情很常见,但较新的应用程序需要新字段来存储相同的概念记录。

    在您的情况下,您真正​​需要的是引用关系,其中记录与零个或另一个记录具有外键关系。您可以像这样流利地设置它:

    References(x=>Category)
        .Column("CategoryId")
        .Inverse()
        .Cascade.None();
    

    问题是现在必须映射类别;它是一个独立的实体,现在与你的相关。您的选择是使用此模型,通过将实体引用设为私有,更改映射以访问实体,并将“传递”编码为您想要公开的属性,或使用代码来“扁平化”它像 AutoMapper 这样的工具,可以在运行时将此深层域模型投影到平面 DTO 中以供一般使用。它们都有优点和缺点。

    【讨论】:

    • 嗯...所以听起来 join 不适用于我的特定情况。为了澄清我的关系,我有一个多对一的关系,我想将一个属性从“一”侧(类别)拉到我的“多”侧(规则)。是的,我考虑过使用引用映射引入整个 Category 实体(我已经映射过),但实际上我想要的只是一个属性,所以我试图变得花哨。可能只是优化一些并不真正需要的东西。感谢您的反馈!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多