每个具体类映射的抽象baseClass的IList流畅的nhibernate表

时间:2013-02-13 18:21:17

标签: c# fluent-nhibernate nhibernate-mapping

我有一个抽象的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”列中没有值?

0 个答案:

没有答案