NHibernate:OnlyLoadBaseClassObjects欢迎任何形式的帮助。即使您可以(根据您的经验)判断,为如此庞大的层次结构使用ORM也是疯狂的:)。背景我的模型层有一个非常庞大的类层次结构,即大约200个类。层次结构的好处/坏处是它们都具有相同的基类。基类和叶类之间的最大距离为7,层次结构中任何级别的最大类数为80。我正在使用nHibernate从持久存储中保存/加载数据。问题nHibernate生成的查询非常高效。例如,如果我想根据基类中某个属性的某些过滤器来选择对象的ID,NHibernate将尝试连接层次结构中的所有表/联合它们,具体取决于我选择的映射策略,即每个子类表或每个类的表层次结构。我知道nHibernate在扫描所有相关表之前没有哪种类型的对象。但是,如果我现在只对基类数据感兴趣怎么办?如何强制nHibernate只加载基类对象。为了说明我的问题,这是一个简单的版本publicclassVehicle{publicvirtualGuidIdentifier{get;放;}publicvirtualintWheelsCount{get;放;}publicvirtualMakeMake{get;放;}公共虚拟模型模型{get;放;}}publicclassBike:Vehicle{publicBike(){WheelsCount=2;}publicvirtualboolIsDirtBike{get;放;}}publicclassCar:Vehicle{publicCar(){WheelsCount=4;}publicvirtualboolIsFourWheelDrive{get;放;}publicvirtualstringTitle{get;放;}publicvirtualstringDescription{get;放;}}publicclassMake{publicvirtualintId{get;放;}publicvirtualstringName{get;放;}公共虚拟IList模型{得到;放;}}publicclassModel{publicvirtualintId{get;放;}publicvirtualstringName{get;放;}publicvirtualMakeMake{get;放;}}映射如下publicclassVehicleMap:ClassMap{publicVehicleMap(){Id(x=>x.Identifier).GeneratedBy.Guid();地图(x=>x.WheelsCount);参考资料es(x=>x.Make).Column("MakeId");引用(x=>x.Model).Column(“ModelId”);表(“车辆”);多态性.Explicit();UseUnionSubclassForInheritanceMapping();}}publicclassBikeMap:SubclassMap{publicBikeMap(){Map(x=>x.IsDirtBike);表(“自行车”);//抽象的();}}publicclassCarMap:SubclassMap{publicCarMap(){Map(x=>x.Title);地图(x=>x.Description);地图(x=>x.IsFourWheelDrive);表(“汽车”);//抽象的();}}publicclassMakeMap:ClassMap{publicMakeMap(){Id(x=>x.Id);地图(x=>x.Name);HasMany(x=>x.Models).KeyColumn("MakeId");表(“制作”);}}publicclassModelMap:ClassMap{publicModelMap(){Id(x=>x.Id);地图(x=>x.Name);引用(x=>x.Make).Column(“MakeId”);表格(“模型”);现在,如果您运行以下查询来加载四轮车辆,NHibernate将加入Vehicles、Cars和Bikes表我现在需要的是存储在Vehicle表中的数据Listvehicles=session.Query().Where(v=>v.WheelsCount>2).ToList();有谁知道我如何强制nHibernate只加载当前需求,即它可以只返回车辆对象而不是汽车/自行车吗?如果你的模式中只有几个表,你可以通过nHibernate忽略这些查询,但是当你有200个表时它真的很痛苦:(。PS如果模型有问题,请忽略它。它不是真正的模型。实际模型如stated更大。这个模型是为了说明问题。NHibernate必须连接表来决定返回哪种类型。否则多态性将被破坏。此外,处理抽象基类等egde将更加困难。.仅投影您需要的属性,您就可以开始了varvehicledatas=session.Query().Where(v=>v.WheelsCount>2).Select(v=>new{v.Id,v.WheelCount,v.Price}).ToList();如果您绝对只需要基类,则针对此用例单独映射它。更多C#学习教程,希望大家多多关注—publicclassAlternateVehicleMap:VehicleMap{publicAlternateVehicleMap(){EntityName("IAbsolutlyWantOnlyTheBaseClass");只读();//确保没有人搞砸}}Listvehicles=session.CreateCriteria("IAbsolutlyWantOnlyTheBaseClass").Add(Expression.Gt("WheelsCount",2).List();本文收集自网络,不代表一个职位,如涉及侵权,请点击右边联系管理员删除,如需转载请注明出处:
