1

我认为主要问题是子类删除了与基本映射集合相关的所有约束。

使用每个具体类策略的表,我发现在另一个(可能相关的)问题中,父集合也没有与子类关联,也没有创建 Basetypes 和 ChildTypes 之间的关联。

我有一个类似于这样的架构:

public class Parent{

   public virtual Int64 Id{get; set;}
   public virtual IList<Foo> foos{get; set;}
   public virtual IList<ParentType> _pts{get; set;}

}

public class child: Parent{
   public virtual int chilInt{get; set;}
}

public class BaseType{
   public virtual Int64 Id{get; set;}
   public virtual Parent ParentReference{get; set;}
}


public class ChildType: BaseType{
    public virtual string childBacon{get; set;}
}

映射文件

<class name="Parent" abstract="true">

<id name="Id" type="Int64" column="Id"  unsaved-value="0">
  <generator class="native"/>
</id>


<set name="foos" inverse="false"  >
  <key column="Id"/>
  <one-to-many class="Foo" />
</set>


<set name="pts" inverse="false"  >
  <key column="Id"/>
  <one-to-many class="ParentType" />
</set>


</class>

<union-subclass name="Child" table="Child" extends="Parent">
     <property name="childInt" type="int" />
</union-subclass>


<class name="ParentType" abstract="true">

  <id name="Id" type="Int64" column="Id"  unsaved-value="0">
   <generator class="native"/>
  </id>

 <many-to-one name="ParentReference" class="Parent"/>

</class>

<union-subclass name="ChildType" table="ChildType" extends="ParentType">
     <property name="childBacon" type="string" />
</union-subclass>

子表与 foo 表没有任何关系的结果。

4

2 回答 2

1

如果您使用 <union-subclass> 映射,很明显 foo 条目与您的子表没有直接关系,因为子表只包含在子类中声明的附加内容。

当使用联合子类映射实例化子实例时,您会在父表和子表中都获得一行。如果您的子实例包含 foo 集中的条目,您会在 foo 表中获得一些与父表相关的行。

使用每个具体类映射的表对于指向父类的关联没有意义(因为 foo 类不是代码示例的一部分似乎是这样做的),因为这样 parent 的不同派生类都继承了 foo 集但 foo 表不能所有这些表都有外键。

于 2012-04-29T22:12:13.873 回答
0

好吧,ORM 和继承有三种常用方法(每个类层次结构表、每个子类表、每个具体类表)。<union-subclass>,您使用的一个,用于每个具体类的表中,它应该嵌入到 parent 中<class>在此处阅读(8.1.5)。

也许它不会解决你所有的问题,但至少它应该有助于建立继承映射。

于 2012-04-25T20:37:23.540 回答