NHibernate 联接的子类在检索基类列表时会导致错误

本文关键字:列表 错误 基类 检索 子类 NHibernate | 更新日期: 2023-09-27 17:56:56

我有一个从我的数据库到我的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>();

就像我在绑定源中填充 ItemHolder 一样,每个 ItemHolder 都有一个完全填充的 ItemCollection,里面装满了 Items。

然而

当我将一个联接的子类添加到 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 但是列表中的第二个项目根本没有映射导致错误。我可以在调试器中看到它的所有属性,但没有类型信息。

我已经隔离了错误,因此如果我从项目映射中删除联接子类,我没有问题,但是我希望拥有此功能。

我意识到这是非常具体的,我没有给出确切的代码,这可能会使事情难以理解,但也许有人经历过类似的事情,或者可以在我的映射中发现错误。

NHibernate 联接的子类在检索基类列表时会导致错误

我发现派生项也在项表中,因此该项被映射到派生项,导致在添加到绑定源时出现问题,因为它们属于不同的类型。