データベースからc#コードへのNhibernateマッピングがあります。構造の簡単な表現をレイアウトします。
class ItemHolder
{
public virtual ICollection<Item> ItemCollection {get;set;}
}
class Item
{
public virtual int Id{get;set;}
public virtual string SomeValue{get;set;}
}
そして私のNHibernateマッピング
<class name="ItemHolder" table ="ItemHolders">
...
<set name="ItemCollection" cascade="all-delete-orphan" inverse="true">
<key column="ItemHolder"/>
<one-to-many class="Item"/>
</set>
</class>
<class name="Item" table="Items">
<id name="ID" generator="native"/>
...
<many-to-one name="ItemHolder" class="ItemHolder"/>
</class>
これはすべて正常に機能し、次のコードを実行すると、期待どおりにすべてを取得します。
bindingSource.DataSource = ISession.CreateQuery("select ih from ItemHolder as ih " +
"left join fetch ih.ItemCollection")
.SetResultTransformer(new DistinctRootEntityResultTransformer())
.List<Item>();
のように、バインディングソースにItemHoldersを入力し、それぞれにItemsでいっぱいの完全に入力されたItemCollectionを入力します。
でも
次のように、プログラムの他の場所で使用するために、結合されたサブクラスをItemに追加すると、次のようになります。
class DerivedItem : Item
{
}
結合されたサブクラスのアイテムマッピングに追加されます。
<class name="Item" table="Items">
<id name="ID" generator="native"/>
...
<many-to-one name="ItemHolder" class="ItemHolder"/>
<joined-subclass name="DerivedItem" table="DerivedItems" extends="Item">
<key column="ID"/>
</joined-subclass>
</class>
今、物事は面白くなります。派生アイテムテーブルから派生アイテムを問題なく取得できますが、上記のc#コードを実行しようとすると、エラーが発生します。
((ItemHolder)bindingSource.Current).ItemCollectionを見ると、コレクションの最初のアイテムはクラスタイプItemにマップされていますが、リストの2番目のアイテムはまったくマップされていないためエラーが発生します。デバッガーでそのすべてのプロパティを確認できますが、タイプ情報は表示されません。
結合されたサブクラスをアイテムマッピングから削除しても問題がないようにエラーを分離しましたが、この機能が必要です。
これは非常に具体的であり、理解を困難にする可能性のある正確なコードを提供していませんが、誰かが同様のことを経験したか、マッピングの間違いを見つける可能性があります。