我有两个类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的结果。
如何从结果中删除子类的项目?
答案 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;包含子集的类 的表格列。)