nhibernate流畅映射延迟加载派生类

时间:2012-04-18 06:18:57

标签: c# nhibernate fluent table-per-subclass

是否有可能在nhibernate / fluent中为每个具体映射获取一个表来发出数据库语句来确定类的类型,然后为详细信息发出另一个语句,而不是加入一个大型左连接的超级中的所有子类表 - 言。

换句话说,子类详细信息可以加载“延迟”。

我使用流畅的nhibernate和ClassMap / SubClassMap映射类映射了类层次结构。每个派生类(无论如何都是大多数)都有自己的表。所以这是每个具体课程的表格。

我没有指定鉴别器值,因为当所有子类包含在同一个表中时使用它们。但是,我在基类表中有一个整数值,表示它是哪种类型。 nhibernate是否能够使用此数据并为派生类数据发出延迟加载。 discriminator值是数据库中的一个整数,对应于基类中的枚举。

例子。

public sealed class PartyMap : ClassMap<Party>
{
  public PartyMap()
  {
     Table("Party");
     // I thought this might do it, but it doesn't :-(
     Polymorphism.Explicit();
     Id(x => x.Id).Column("PartyId");
     Map(x => x.PartyType).CustomType<PartyType>().Column("PartyTypeId");
     Map( ...
     // if I specify this, nhibernate expects all the fields
     // to be in the base class table, above Table(...) is the only one used.
     // DiscriminateSubClassesOnColumn<int>("PartyTypeId", 0).AlwaysSelectWithValue();
   }
}

public class PersonMap : SubclassMap<Person>
{
    public PersonMap()
    {
        Table("Person");
        KeyColumn("PartyId");   
        // if I specify this, nhibernate expects all the fields
        // to be in the base class table, above Table(...) is ignored.      
        // DiscriminatorValue((int) PartyType.Person);
     }
}

1 个答案:

答案 0 :(得分:2)

简短的回答:不,这是不可能的。 IIRC,即使您使用鉴别器,行为也完全相同。

如果关注的连接太多(因为你有很多继承类),你应该考虑使用Table per class hierarchyTable per sublass with discriminator(如果大多数类都有一组类似的属性,只有少数几个他们是完全不同的)