流利的nHibernate加入

Ben*_*man 4 c# nhibernate join fluent-nhibernate fluent-nhibernate-mapping

我有一个实体映射到一个名为Rule的表.此实体的表具有另一个名为Category的表的FK.我试图找出如何从我的规则实体中的类别中提取属性.我很确定我想在我的实体映射中使用连接,但我无法弄清楚如何配置它以使其工作.这是我的映射:

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

这是它正在生成的SQL ...

SELECT ...
FROM Rule rules0_ left outer join Category rules0_1_ on rules0_.Id=rules0_1_.CategoryId
WHERE ...
Run Code Online (Sandbox Code Playgroud)

这是我想要的SQL.

SELECT ...
FROM Rule rules0_ left outer join Category rules0_1_ on rules0_.CategoryId=rules0_1_.Id
WHERE ...
Run Code Online (Sandbox Code Playgroud)

我似乎无法在JoinPart上找到任何可以让我这样做的东西.从我发现的一些文档中看,Subselect看起来很有希望,但我找不到任何如何使用它的例子.对此问题的任何建议将不胜感激.谢谢!

Kei*_*thS 7

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

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

References(x=>Category)
    .Column("CategoryId")
    .Inverse()
    .Cascade.None();
Run Code Online (Sandbox Code Playgroud)

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