Nhibernate - 在存储库返回结果中获取两个对象类型

时间:2017-04-26 11:35:49

标签: c# nhibernate

我有两个类BookingInfo.cs和BookingTransaction类。

  public class BookingInfo
    {
      public virtual string Code { get; set; }
    }

  public class BookingTransaction : BookingInfo   {
        public virtual string CustomerRefNo { get; set; }
     }

下面是两个类的NHibernate映射

   public class BookingInfoConfiguration : ClassMap<BookingInfo> {
            public BookingInfoConfiguration() {
                Table("Bkg_BookingInfo");
                LazyLoad();
                DynamicUpdate();
                Id(x => x.Id).GeneratedBy.GuidComb().UnsavedValue(Guid.Empty);
        }
    }

      public class BookingTransactionConfiguration : 
     ClassMap<BookingTransaction> {
            public BookingTransactionConfiguration() {
                Table("Bkg_BookingInfo");
                LazyLoad();
                DynamicUpdate();
                Id(x => x.Id).GeneratedBy.GuidComb().UnsavedValue(Guid.Empty);
    }
}

现在我正在查询从数据库中获取行。

 CurrentSession.Query<BookingInfo>().ToList();

我在数据库表中获得了单行的两个项目。一个用于 Bookinginfo ,另一个用于 BookingTransaction 。但我只想得到类型为Bookinginfo的结果。

如何从结果中删除子类的项目?

2 个答案:

答案 0 :(得分:1)

它打算让NHibernate返回两个对象。要防止此行为,请创建一个抽象基类,其他类派生。然后您不需要复制代码,您可以单独查询每个类。

创建基类:

public abstract class BookingBase
{
    public virtual string Code { get; set; }
}

然后从中派生你的类:

public class BookingInfo : BookingBase
{
}
public class BookingTransaction : BookingBase
{
    public virtual string CustomerRefNo { get; set; }
}

您的映射和查询可以保持不变。如果您想使用一个查询查询这两个类,只需查询BookingBase

答案 1 :(得分:1)

Rabban's answer所述,这是设计上的。这称为隐式多态。 Rabban建议您更改类层次结构,但如果您愿意,可以禁用隐式多态。

使用hbm映射(我不使用流利且不知道它),在您的类上添加属性polymorphism="explicit"

按代码进行映射也会在具有.Polymorphism(PolymorphismType.Explicit)的类映射器上支持它。

您可以阅读有关隐式/显式多态here的更多信息:

  

隐式多态意味着该类的实例将是   由命名任何超类或已实现接口的查询返回   或类和该类的任何子类的实例   由命名类本身的查询返回。 显式多态性   表示只返回类实例的查询   显式地命名该类以及该类命名的查询   仅返回映射到此<class>内的子类的实例   声明为<subclass><joined-subclass>。对于大多数目的   默认值polymorphism="implicit"是合适的。明确的   当两个不同的类映射到时,多态性很有用   相同的表(这允许&#34;轻量级&#34;包含子集的类   的表格列。)