我有一个抽象基类和 2 个派生类。我还有一个 OwnerClass,它包含一个IList
BaseClass 类型。
我根据 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”列中没有值?