我有两个类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
。