2013-05-15 80 views
2

大家好,功能NHibernate的table-per-继承(TPH)映射多类层次结构中的

我有一个功能NHibernate问题挣扎。 我已经在我的解决方案如下阶层结构的模板:

class OneClass 
{ 
    public virtual string OneProp {get; set;} 
} 

class TwoClass : OneClass 
{ 
    public virtual string TwoProp {get; set;} 
} 

class ThreeClass : TwoClass 
{ 
    public virtual string ThreeProp {get; set;} 
} 

而且我想使用的table-per-继承层次战略我类包含在数据库中的一个表中的所有数据。

如何通过流利NHibernate做到这一点?

我已经尝试了以下情况:

1.我已经加入鉴别器的父类

public class OneClassMappingOverride : IAutoMappingOverride<OneClass> 
{ 
     public void Override(AutoMapping<OneClass> mapping) 
     { 
      mapping.DiscriminateSubClassesOnColumn("Type"); 
      mapping.SubClass<OneClass>("OneClass"); 
      mapping.SubClass<TwoClass>("TwoClass"); 
      mapping.SubClass<ThreeClass>("ThreeClass"); 
     } 
} 

但我有例外:(XmlDocument的)(56,8):XML验证错误:命名空间'urn:nhibernate-mapping-2.2'中的元素'subclass'在命名空间'urn:nhibernate-mapping-2.2'中具有无效的子元素'joined-subclass'。可能的元素列表:meta,tuplizer,同步,属性,多对一,一对一,组件,动态组件,属性,任意,映射,集合,列表,包,idbag,数组,原语在'urn:nhibernate-mapping-2.2'命名空间中的'-array,join,subclass,loader,sql-insert,sql-update,sql-delete,resultset,query,sql-query'。

,因为我有以下自动生成的NHibernate的XML映射:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class xmlns="urn:nhibernate-mapping-2.2" name="MyClass.Domain.OneClass, MyClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="`OneClass`"> 
    <cache usage="read-write" /> 
    <id name="PersistenceId" type="System.Guid, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="Id" /> 
     <generator class="Systematic.Persistence.NHibernate.NHibernateIdGenerator, Systematic.Core, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
    </id> 
    <discriminator type="String"> 
     <column name="Type" /> 
    </discriminator> 
    <version generated="never" name="PersistedVersion" type="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" unsaved-value="0"> 
     <column name="PersistedVersion" /> 
    </version> 
    <property name="OneProp" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="OneProp" length="255" /> 
    </property> 
    <property name="DisplayName" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="DisplayName" length="256" index="idx__DisplayName" /> 
    </property> 
    <property name="SystemName" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="SystemName" length="256" index="idx__SystemName" not-null="true" /> 
    </property> 
    <property name="Version" type="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="Version" not-null="true" /> 
    </property> 
    <property name="Description" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="Description" length="10000000" /> 
    </property> 
    <many-to-one class="Systematic.Persistence.PersistenceInfo, Systematic.Api, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" fetch="join" lazy="false" name="Persistence"> 
     <column name="Persistence_id" index="idx__Persistence" not-null="true" /> 
    </many-to-one> 
    <subclass name="MyClass.Domain.TwoClass, MyClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"> 
     <property name="TwoProp" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="TwoProp" length="255" /> 
     </property> 
     <joined-subclass name="MyClass.Domain.ThreeClass, MyClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"> 
     <key> 
      <column name="TwoClass_id" /> 
     </key> 
     <property name="ThreeProp" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
      <column name="ThreeProp" length="255" /> 
     </property> 
     </joined-subclass> 
    </subclass> 
    </class> 
</hibernate-mapping> 

2.我已尝试添加不同的鉴别

public class OneClassMappingOverride : IAutoMappingOverride<OneClass> 
{ 
     public void Override(AutoMapping<OneClass> mapping) 
     { 
      mapping.DiscriminateSubClassesOnColumn("OneType"); 
     } 
} 

public class TwoClassMappingOverride : IAutoMappingOverride<TwoClass> 
{ 
     public void Override(AutoMapping<TwoClass> mapping) 
     { 
      mapping.DiscriminateSubClassesOnColumn("TwoType"); 
     } 
} 

但是,如果没有从系统(同样的异常和任何结果映射文件)

3.我试图使用ClassMap <>和SubclassMap <>

public class OneClassMap : ClassMap<OneClass> 
{ 
    public OneClassMap() 
    { 
     DiscriminateSubClassesOnColumn("Type"); 

     Id(x => x.Id); 

     Map(x => x.OneProp); 
    } 
} 

public class TwoClassMap : SubclassMap<TwoClass> 
{ 
    public TwoClassMap() 
    { 
     DiscriminatorValue("TwoType"); 

     Map(x => x.TwoProp); 
    } 
} 

public class ThreeClassMap : SubclassMap<ThreeClass> 
{ 
    public ThreeClassMap() 
    { 
     DiscriminatorValue("ThreeType"); 

     Map(x => x.ThreProp); 
    } 
} 

在这种情况下,我有三个表(OneClass,TwoClass和三级类在我的DB)还我有以下XML映射文件:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class xmlns="urn:nhibernate-mapping-2.2" name="MyClass.Domain.OneClass, MyClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="`OneClass`"> 
    <cache usage="read-write" /> 
    <id name="PersistenceId" type="System.Guid, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="Id" /> 
     <generator class="Systematic.Persistence.NHibernate.NHibernateIdGenerator, Systematic.Core, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
    </id> 
    <version generated="never" name="PersistedVersion" type="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" unsaved-value="0"> 
     <column name="PersistedVersion" /> 
    </version> 
    <property name="OneProp" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="OneProp" length="255" /> 
    </property> 
    <property name="DisplayName" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="DisplayName" length="256" index="idx__DisplayName" /> 
    </property> 
    <property name="SystemName" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="SystemName" length="256" index="idx__SystemName" not-null="true" /> 
    </property> 
    <property name="Version" type="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="Version" not-null="true" /> 
    </property> 
    <property name="Description" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="Description" length="10000000" /> 
    </property> 
    <many-to-one class="Systematic.Persistence.PersistenceInfo, Systematic.Api, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" fetch="join" lazy="false" name="Persistence"> 
     <column name="Persistence_id" index="idx__Persistence" not-null="true" /> 
    </many-to-one> 
    <joined-subclass name="MyClass.Domain.TwoClass, MyClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"> 
     <key> 
     <column name="OneClass_id" /> 
     </key> 
     <property name="TwoProp" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="TwoProp" length="255" /> 
     </property> 
     <joined-subclass name="MyClass.Domain.ThreeClass, MyClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"> 
     <key> 
      <column name="TwoClass_id" /> 
     </key> 
     <property name="ThreeProp" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
      <column name="ThreeProp" length="255" /> 
     </property> 
     </joined-subclass> 
    </joined-subclass> 
    </class> 
</hibernate-mapping> 

我不我不知道如何解决我的问题。也许有人会帮我解决这个问题。

非常感谢。

真诚, 阿列克谢

回答

0

我相信,在你的情况下,这个问题可以通过在层级上不同类别而导致被放置在不同的组件。我也遇到过这个问题,看起来像这样的案件不被Fluent支持。

我找到了我的情况here,他们通过使父类抽象来修复它。仍在努力查明是否有其他方式或官方声明称其不被支持,但尚未成功。

+0

与抽象类它真的有效,但只是类问题仍然打开。 –

1

我试图解决类似的问题。同样在我的情况下,我在一个程序集中有一个类,并且想从这个非抽象的基类继承一个不同程序集中的类。流利的NHibernate将不会映射第二个(继承的)类。正如上面的职位描述,似乎只可能在

  1. 只有抽象类是在不同的组件和
  2. 从继承层次结构的所有非抽象类是在同一组件继承层次映射

在我看来,这是一个非常严格的领域建模设计限制。能否接近Fluent NHibernate项目的人确认不可能继承不同程序集中的非抽象类?还是有人有解决这个问题的解决方案?

谢谢,罗兰。