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。

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

如拉班回答中所述,这是设计。这称为隐性多态性。Rabban建议您更改类层次结构,但是如果您愿意,可以禁用隐式多态性。

使用HBM映射(我不使用流利并且不知道(,请在您的课堂上添加属性polymorphism="explicit"

代码映射也支持使用.Polymorphism(PolymorphismType.Explicit)的类映射器。

您可以在此处阅读有关隐式/显式多态性的更多信息:

隐式多态性意味着班级的实例将是 由名称任何超级类或实现接口的查询返回 或班级和班级任何子类的实例 由命名类本身的查询返回。显式多态性 意味着课堂实例将仅返回 明确命名该类,并查询该班级的名字 仅返回该<class>中映射的子类的实例 声明为<subclass><joined-subclass>。出于大多数目的 默认值polymorphism="implicit"是合适的。显式 当两个不同的类映射到 同一表(这允许一个包含子集的"轻量级"类 表列(。

它的意图是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