如何使 nhibernate 不结合继承对象的结果?

Posted

技术标签:

【中文标题】如何使 nhibernate 不结合继承对象的结果?【英文标题】:How to make nhibernate not combine results from inherited objects? 【发布时间】:2018-11-08 15:01:07 【问题描述】:

我对休眠查询有疑问。 我得到的结果是两张桌子的混合。 我如何告诉 nhibernate 不要合并来自不同表的结果。

这是我的查询:

using (var session = SessionFactory.OpenSession())

   using (var transaction = session.BeginTransaction())
   
      timeEntryReportIds = session.Query<XXXX>()
                .Where(x => x.SentToServiceLeader == true && x.StartDate < cutoffDate)
                .Select(x => x.Id)
                .ToList();
      transaction.Commit();
   

我的 XXXX 类映射如下所示:

public class XXXXMapping : ClassMapping<XXXXEntity>

    public XXXXMapping()
    
        Table("XXXX");
        Property(x => x.X1, c => c.Type<UtcDateTimeType>());
        Property(x => x.X2, c => c.Type<UtcDateTimeType>());
        Property(x => x.X3, c => c.Index("IX_X3"));
        Property(x => x.X4, c => c.Index("IX_X4"));
        Property(x => x.X5);
        Property(x => x.X6);
    

我还有一个看起来像这样的:

public class YYYYYMapping : ClassMapping<YYYYYEntity>
...

我的类是这样定义的:

public class XXXXEntity : MwlEntityBase
...

public class YYYYEntity : XXXXEntity
...

我遇到的问题是,当我运行查询时,我从 XXXX 和 YYYYY 表中都得到了结果。 我如何告诉 nhibernate 不要那样做!

我来这里之前做了一些研究,它告诉我需要扩展基类,但我无法控制 [MwlEntityBase] 类。我可以控制的其他课程。 我试图将 Classmapping 继承从 ClassMapping 更改为 UnionSubclassMapping 和 JoinedSubclassMapping。但是当我们开始谈论缺少根元素或类似的事情时,它失败了。我认为这是因为我无法更改 MwlEntityBase 类? 也可能是我做错了。

无论如何,我需要帮助以正确的方法来解决这个问题。我什至可以选择一种不正确的方法来解决这个问题,它确实有效:)

【问题讨论】:

【参考方案1】:

简短的回答,不要从 XXXX 继承^^ 只需创建一个抽象基类并从该基类派生 XXXX 和 YYYY。

public abstract class BaseEntity : MwlEntityBase

    // The common properties for XXXX and YYYY.


public class XXXX : BaseEntity 

public class YYYY : BaseEntity 

【讨论】:

以上是关于如何使 nhibernate 不结合继承对象的结果?的主要内容,如果未能解决你的问题,请参考以下文章

python面向对象(封装,继承,多态)

NHibernate总结

如何结合 NHibernate Fluent 和 WPF-NHibernate 工具包中的 VmWrapper-Classes?

如何在nHibernate中映射一个继承抽象类并同时实现接口的类?

NHibernate - 外连接,不懒惰,忽略未找到 - 你如何在一个语句中构建对象?

NHibernate - 如何使用 where 子句保存对象