4

我有一个映射到名为 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 看起来很有希望,但我找不到任何如何使用它的示例。对此问题的任何建议将不胜感激。谢谢!

4

1 回答 1

7

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

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

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

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

于 2011-06-14T22:30:40.670 回答