流nなnhibernateのidフィールドとしてクラスを持つコンポジットIDを使用するにはどうすればよいですか?
-
05-07-2019 - |
質問
次のようなマッピングファイルがあります:
<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の課題トラッカーを参照してください) )。
所属していません StackOverflow