TL; DRバージョン:以下のコードは、SessionFactoryを構築するときに「関連付けがマップされていないクラスを参照する」という例外を示します。それを修正するには、コードで何を変更する必要がありますか?
Ayende @ Rahienは、この2007年の記事でジェネリッククラスへのマッピングを使用することを推奨していませんが、それでも試してみました。私は彼が言及したアプローチを使用しました。まず、機能しているビット:
<class name="Review`1[Person]" table="Review">
<id name="Id" column="ReviewId"><generator class="native" /></id>
<property name="Rating" />
<many-to-one name="Subject" column="PersonId" class="Person" />
</class>
対応するジェネリッククラスは次のようになります。
public class Review<T> : BaseEntity where T : IReviewable
{
public virtual int Rating { get; set; }
public virtual T Subject { get; set; }
}
これは機能しており、これらのエンティティをロードReview
して、MVCビューに問題なく表示できます。良い部分はSubject
、コントローラーとビューで使用したときに正しいタイプになることです。
ただし、Personクラスにレビューアイテムのコレクションをマップしようとすると、問題が発生し始めます。現在使用しているマッピングは次のとおりです。
<class name="Person">
<!-- abbreviated -->
<bag name="Reviews" table="Review">
<key column="PersonId"/>
<one-to-many class="Review`1[Person]" />
<!-- Also tried these:
<one-to-many class="table="Review">
... plus a few variations with fully qualified names ...
-->
</bag>
</class>
この(省略された)クラスの場合:
public class Person : BaseEntity, IReviewable
{
/* Abbreviated */
public virtual IList<Review<Person>> Reviews { get; set; }
}
これは、SessionFactoryの構築中の例外で終了します。
アソシエーションはマップされていないクラスを参照します:....ここに1対多のクラスを挿入します...。
だから質問:ここでの問題は何ですか?これも可能ですか?ジェネリックエンティティのマッピングをあきらめる必要がありますか?