我有一个抽象的BaseClass和2个DerivedClasses。
我还有一个OwnerClass,它拥有BaseClass类型的IList
。
我根据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对象并用(new)DerivedClass1和DerivedClass2填充它们。 我创建了一个Owner对象,并在其列表中添加了BaseClasses对象。
当我尝试保存所有者对象时,我得到了
GenericADOException:无法插入集合... SQL:UPDATE 的BaseClass ...
我很惊讶地看到它试图访问一个名为'BaseClass'的表,因为没有这样的表!
我在OwnerClass映射中尝试了选项2 - 添加了Inverse()。当我保存Owner对象时,结果是所有者对象保存在Owner表中,DerivedClasses对象保存在他们的表中但在'Owner_Id'列没有值。
为什么我需要使用Inverse()?更重要的是,为什么“Owner_Id”列中没有值?