2

私は次の表を持っています

tblChild

父コード 子番号 名前

FatherCodeおよびChildNumberはテーブルの主キーです。

このようなことがこのデータベースで非常に頻繁に発生するため (私はそれをまったく制御できません)、ID をマップするために次のクラスを作成しました。

public class ComposedId {
   public virtual int FatherId {get;set;}
   public virtual int ChildId {get;set;}
   //More code implementing Equals and GetHashCode
}

さて、マッピングは次のようになります。

aMapper.Class<Child>(aClassMapper => aClassMapper.ComposedId(aComposedIdMapper =>
                {
                    aComposedIdMapper.Property(aChild => aChild.Id); //Id's implementation is: public virtual ComposedId Id {get;set;}
                }));

aMapper.Class<Child>(aClassMapper => aClassMapper.ComponentAsId(aChild => aChild.Id, aComponentAsIdMapper =>
    {
        aComponentAsIdMapper.Property(aComposedId => aComposedId.FatherId, aPropertyMapper => aPropertyMapper.Column("FatherCode"));
        aComponentAsIdMapper.Property(aComposedId => aComposedId.ChildId, aPropertyMapper => aPropertyMapper.Column("ChildNumber"));
    }));

しかし、テーブルにクエリを実行しようとすると、NHibernate は Id を列として取得しようとします。

何が間違っているのかわからず、これをこの構造でマップする方法をたくさん試しましたが、何も機能しません:(

4

1 に答える 1

2

マッピングの最初の行が正しくありません。

これは、コードの単純化されたバージョンです。

mapper.Class<Child>(cm => cm.ComponentAsId(
    x => x.Id,
    caim =>
    {
        caim.Property(x => x.FatherId, pm => pm.Column("FatherCode"));
        caim.Property(x => x.ChildId, pm => pm.Column("ChildNumber"));
    }));

そして、このマッピング (XML シリアル化) を正しく生成しました。

<composite-id class="ComposedId" name="Id">
  <key-property name="FatherId" column="FatherCode" />
  <key-property name="ChildId" column="ChildNumber" />
</composite-id>

...これにより、正しい SQL が生成されます。

あなたは最初の行なしで試したとコメントで言っていますが、おそらくテスト時にサーバーをコンパイル、デプロイ、または再起動するのを忘れていました。

補足として、 のプロパティの名前をComposedIddb と一致するように変更して を使用するConventionModelMapper場合、ID を手動でマップする必要さえありません。


XML マッピングを取得するには、これを使用します。

var mappingDocument = mapper.CompileMappingForAllExplicitlyAddedEntities();
new XmlSerializer(typeof(HbmMapping)).Serialize(Console.Out, mappingDocument);
于 2012-07-07T01:41:57.467 に答える