【问题标题】:NHibernate constraints associations of a parent class are dropped on the subclass父类的 NHibernate 约束关联被丢弃在子类上
【发布时间】:2012-04-25 16:13:25
【问题描述】:

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

使用每个具体类策略的表,我发现父集合与子类关联也在另一个(可能相关)问题中,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表没有任何关系的结果。

【问题讨论】:

  • 您能说得更具体些吗?目前尚不清楚问题是什么。 (另外还有明显的问题,比如使用 'ref' 作为名称。你的代码不会编译,除非你不使用 C# :))
  • 谢谢,我做了一些更改和更正,希望这能更好地解释我的疑问,任何更多建议将不胜感激:)

标签: nhibernate inheritance nhibernate-mapping


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的出色回答,您帮助我进一步了解了 NHibernate。
【解决方案2】:

嗯,ORM 和继承有三种常见的方法(每个类层次结构的表、每个子类的表、每个具体类的表)。 &lt;union-subclass&gt;,您使用的一个,用于每个具体类的表中,它应该嵌入父级&lt;class&gt;。阅读它here (8.1.5)。

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

【讨论】:

  • 其实你可以把映射文件滑进去看here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-28
  • 1970-01-01
相关资源
最近更新 更多