欢迎任何形式的帮助。即使您可以说(根据您的经验)对于如此庞大的层次结构使用 ORM 是疯狂的:)。
背景我的模型层有一个相当庞大的类层次结构,即大约有 200 个类。层次结构的好处/坏处是它们都具有相同的基类。基类和叶类之间的最大距离为 7,层次结构中任何级别的最大类数为 80。
我正在使用 nHibernate 从持久存储中保存/加载数据。
ProblemnHibernate 生成的查询非常高效。例如,如果我想根据基类中某个属性的某些过滤器来选择对象的 id,NHibernate 将尝试连接层次结构/联合中的所有表,具体取决于我选择哪种映射策略,即每个子类一个表或每个类一个表等级制度。
据我所知,nHibernate 在扫描所有相关表之前不会识别哪种类型的对象。但是如果我现在只对基类数据感兴趣怎么办?如何强制 nHibernate 仅加载基类对象。
为了说明我的问题,这是一个简化版本
public class Vehicle
{
public virtual Guid Identifier { get; set; }
public virtual int WheelsCount { get; set; }
public virtual Make Make { get; set; }
public virtual Model Model { get; set; }
}
public class Bike : Vehicle
{
public Bike()
{
WheelsCount = 2;
}
public virtual bool IsDirtBike { get; set; }
}
public class Car : Vehicle
{
public Car()
{
WheelsCount = 4;
}
public virtual bool IsFourWheelDrive { get; set; }
public virtual string Title { get; set; }
public virtual string Description { get; set; }
}
public class Make
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual IList<Model> Models { get; set; }
}
public class Model
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual Make Make { get; set; }
}
映射如下
public class VehicleMap : ClassMap<Vehicle>
{
public VehicleMap()
{
Id(x => x.Identifier).GeneratedBy.Guid();
Map(x => x.WheelsCount);
References(x => x.Make).Column("MakeId");
References(x => x.Model).Column("ModelId");
Table("Vehicle");
Polymorphism.Explicit();
UseUnionSubclassForInheritanceMapping();
}
}
public class BikeMap : SubclassMap<Bike>
{
public BikeMap()
{
Map(x => x.IsDirtBike);
Table("Bike");
// Abstract();
}
}
public class CarMap : SubclassMap<Car>
{
public CarMap()
{
Map(x => x.Title);
Map(x => x.Description);
Map(x => x.IsFourWheelDrive);
Table("Car");
// Abstract();
}
}
public class MakeMap : ClassMap<Make>
{
public MakeMap()
{
Id(x => x.Id);
Map(x => x.Name);
HasMany(x => x.Models)
.KeyColumn("MakeId");
Table("Make");
}
}
public class ModelMap : ClassMap<Model>
{
public ModelMap()
{
Id(x => x.Id);
Map(x => x.Name);
References(x => x.Make)
.Column("MakeId");
Table("Model");
}
}
现在,如果运行以下查询来加载四轮车辆,NHibernate 将连接车辆、汽车和自行车表。而我现在只需要存储在 Vehicle 表中的数据
List<Vehicle> vehicles = session.Query < Vehicle > ().Where(v => v.WheelsCount > 2).ToList();
有谁知道我如何强制 nHibernate 仅加载当前需要的数据,即它是否只能返回车辆对象而不是汽车/自行车?只要架构中只有几个表,您就可以忽略 nHibernate 的这些查询,但当您有 200 个表时,这真的很痛苦:(。
附:如果型号有问题,请忽略。这不是真实的模型。如前所述,实际模型要大得多。这个模型就是为了说明这个问题。