流nなnhibernateのidフィールドとしてクラスを持つコンポジットIDを使用するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1203078

質問

次のようなマッピングファイルがあります:

<class name="Resource" table="resource" discriminator-value="null">
    <composite-id name="Key" class="Models.Bases.ClientKey, Models">
        <key-property name="Id" column="ID" type="int"/>
        <key-property name="SiteId" column="clientID" type="int"/>
    </composite-id>
    <property name="Name" type="String">
        <column name="`name`" length="500" sql-type="varchar" not-null="false"/>
    </property>
</class>

これは正常に機能し、idクラスは次のとおりです。

public class ClientKey
{
    public int Id { get; set; }
    public int ClientId { get; set; }
}

public class Resource
{
    public virtual ClientKey Key { get; set; }
    public virtual string Name { get; set; }
}

FluentNhibernateを使用してこれを再マップするにはどうすればよいですか?このコードは機能しません:

WithTable("resource");
UseCompositeId()
   .WithKeyProperty(x => x.Key.Id, "ID")
   .WithKeyProperty(x => x.Key.ClientId, "clientID");
Map(x => x.Name);

このエラーがスローされます: クラス 'Models.Resource'でプロパティ 'Id'の取得メソッドが見つかりませんでした

ありがとう!!!

役に立ちましたか?

解決

Resourceクラスを変更せずに修正することはできないと思います。 Fluent NHibernateのソースを確認しました。composite-idパーツを出力するコードは次のとおりです。

XmlElement element = classElement.AddElement("composite-id");
foreach( var keyProp in keyProperties )
{
  keyProp.Write(element, visitor);
}

不足しているのは&quot; name&quot;です属性。「Key」に設定する必要があります。この属性がないと、NHibernateはデフォルトのプロパティ名=&quot; Id&quot;にフォールバックします。クラスにはIdプロパティがないため、NHibernateは何をすべきかを知らず、例外をスローします。

Resourceクラスを変更できない場合は、このクラスにhbmマッピングを使用するか、流nなnhibernateへのパッチを作成する必要があります(これは既知の問題であり、誰かが作業している可能性があります-流nなnhibernateの課題トラッカーを参照してください) )。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top