微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

流利的nHibernate Join

如何解决流利的nHibernate Join

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

解决方法

        \“ Join \”的名字很差。 NHibernate映射中的\“ join \”表示基于两个表的主键的关系为零对一关系。例如,如果您有一个User表和一个UserAdditionalInfo表,并且每个User记录为零或一个,则可以使用联接。 UserAdditionalInfo表可能会引用用户的PK作为外键和它自己的主键。当DBA必须认真维护旧版应用程序的架构,但是更新的应用程序需要新字段来存储相同的概念记录时,这种情况很常见。 您实际需要的是引用关系,其中一条记录与零个或一个其他记录具有外键关系。您可以像这样流畅地设置它:
References(x=>Category)
    .Column(\"CategoryId\")
    .Inverse()
    .Cascade.None();
问题是类别现在必须被映射。它是一个与您现在相关的独立实体。您可以选择使用该模型,通过将实体引用设为私有,对映射进行更改以使其“扁平化”,更改对实体的访问,并为要公开的属性编码“传递”,或者通过使用诸如AutoMapper之类的代码工具在运行时将该深度域模型投影到平坦的DTO中,以进行常规使用。他们都有优点和缺点。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。