我有一个从我的数据库到我的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填充绑定源时,每个都有一个完全填充的ItemCollection项目。
无论其
当我将一个连接的子类添加到Item以供我的程序中的其他地方使用时:
class DerivedItem : Item
{
}
添加了连接子类的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,但列表中的第二个项目根本不会映射导致错误。我可以在调试器中看到它的所有属性,但没有类型信息。
我已经隔离了错误,所以如果从Item映射中删除join-subclass我没有问题,但是我希望有这个功能。
我意识到这是非常具体的,而且我没有给出可能使事情难以理解的确切代码,但也许有人经历了类似的事情或者在我的映射中发现了错误。
答案 0 :(得分:0)
我发现DerivedItem也在Item表中,因此Item被映射到派生项,导致在添加到绑定源时出现问题,因为它们的类型不同。