大家好,功能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>
我不我不知道如何解決我的問題。也許有人會幫我解決這個問題。
非常感謝。
真誠, 阿列克謝
與抽象類它真的有效,但只是類問題仍然打開。 –