2

こんにちは、みんな、

Fluent NHibernate の 1 つの問題に苦しんでいます。私のソリューションには、次のクラス構造のテンプレートがあります。

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;}
}

そして、データベース内の 1 つのテーブルにすべてのデータを含めるために、クラスに継承ごとのテーブル階層戦略を使用したいと考えています。

Fluent 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 に無効な子要素 'joined-subclass' があります: nhibernate-mapping-2.2'. 予想される可能な要素のリスト: 'meta、tuplizer、synchronize、property、多対 1、1 対 1、component、dynamic-component、properties、any、map、set、list、bag、idbag、array、primitive -array、join、subclass、loader、sql-insert、sql-update、sql-delete、resultset、query、sql-query がネームスペース 'urn:nhibernate-mapping-2.2' にあります。

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);
    }
}

この場合、3 つのテーブル (DB に OneClass、TwoClass、および ThreeClass) があり、次の 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>

どうすれば問題を解決できるかわかりません。多分誰かがこの問題で手を貸してくれます。

どうもありがとう。

敬具、アレクセイ

4

3 に答える 3

0

あなたの場合の問題は、階層内の異なるクラスが異なるアセンブリに配置されていることが原因である可能性があると思います。私もこの問題に直面しましたが、そのようなケースは Fluent ではサポートされていないようです。

ここでまさに私の状況を見つけ、親クラスを抽象化することで修正しました。サポートされていないが、まだ成功していないという他の方法または公式声明があるかどうかを見つけるのにまだ苦労しています。

于 2013-05-23T13:37:03.440 に答える