0

我有一个抽象基类和 2 个派生类。我还有一个 OwnerClass,它包含一个IListBaseClass 类型。

我根据 Table Per Concrete Class (TPC) 模型映射了类:(如果我的代码中有语法错误,请原谅我,我在记事本上重新编写了我的代码,因为我的真实代码目前无法访问)

public class BaseClassMap : ClassMap<BaseClass>
{
    public BaseClassMap()
    {
        // ID + Fields Mapping... 

        UseUnionSubClassForInheritanceMapping(); 
    }
}

public class DerivedClass1Map : SubclassMap<DerivedClass1>
{
    public DerivedClass1Map()
    {
        // Fields Mapping...
    }
}

public class DerivedClass2Map : SubclassMap<DerivedClass2>
{
    public DerivedClass1Map()
    {
        // Fields Mapping...
    }
}

public class OwnerClassMap : ClassMap<OwnerClas>
{
    public OwnerClassMap()
    {
        // ID + Fields Mapping...

        HasMany(x => x.BaseClassList).Cascade().All();

        // Option 2 - Using Inverse:
        // HasMany(x => x.BaseClassList).Cascade().All().Inverse();
    }
}

我将 nhibernate 配置为通过映射为我创建表。为每个 DerivedClass 创建一个表,其中包含一个名为“Owner_Id”的新列。正如我所料,对于抽象 BaseClass 没有创建表。

我创建了一些 BaseClasses 对象并用(新的)DerivedClass1 和 DerivedClass2 填充它们。我创建了一个 Owner 对象并将 BaseClasses 对象添加到它的列表中。

当我尝试保存 Owner 对象时,我得到

GenericADOException: 无法插入集合... SQL: UPDATE BaseClass...

我很惊讶地看到它试图访问一个名为“BaseClass”的表,因为没有这样的表!

我在 OwnerClass 映射中尝试了选项 2 - 添加 Inverse()。当我保存 Owner 对象时,结果是所有者对象保存在 Owner 表中,而 DerivedClasses 对象保存在它们的表中,但它们的“Owner_Id”列没有值。

为什么我需要使用 Inverse()?更重要的是,为什么“Owner_Id”列中没有值?

4

0 回答 0