【问题标题】:NHibernate one-to-many mappingNHibernate 一对多映射
【发布时间】:2013-07-01 01:07:00
【问题描述】:

我想映射一对多对象 Person 和个人地址

public class Person{
public virtual int Id {get; set;} public virtual string FirstName {get; set;}
public virtual ICollection<PersonAddress> PersonAddress { get; set; }}

public class PersonAddress{
public virtual int Id {get; set;}
public virtual int PersonId {get; set;}
...     }

我不想在地址中有 person 对象属性。它会创建循环引用,我的应用程序不需要。

映射文件如下:

<class name="Person"  table="Persons" >
    <id name="Id" type="Int32" column="PersonId">
        <generator class="identity"/>
    </id>
    <set name="PersonAddress" table="PersonAddress" lazy="true" fetch="join" outer-join="true" cascade="all-delete-orphan">
        <key column="PersonId"></key>
        <one-to-many class="PersonAddress"/>
    </set>  
</class>

<class name="PersonAddress"  table="PersonAddress" >
    <id name="Id" type="Int32" column="Id">
        <generator class="identity"/>
    </id>
    <property name="PersonId" column="PersonId" type="Int32"/>
    <property name="PhoneWork" column="PhoneWork" type="String"/>       
</class>

当尝试使用人员地址插入人员时,我收到异常。因为它试图插入带有无效 id 的 PersonAddress(默认为 -1、0 等)。

在我发现的样本中,指定了从子到父的反向引用

【问题讨论】:

标签: .net nhibernate


【解决方案1】:

试试这个:

public class Person {
    public virtual int Id { get; set; }
    public virtual string FirstName { get; set; }
    public virtual IList<PersonAddress> PersonAddress { get; set; }
    ... }

public class PersonAddress {
    public virtual int Id { get; set; }
    public virtual Person Person { get; set; }
    ... }

您应该有对 Person 的引用,而不仅仅是 PersonId。 如果您对 .hbm.xml 映射文件有疑问,请考虑改用 Fluent NHibernate。它的自动映射功能就像一个魅力。

NHibernate 上还有一个video series,它很好地涵盖了这个主题。

【讨论】:

  • 我知道双向是可能的。但我在考虑没有它的可能性。据我了解,这是不可能的。
  • 不知道有没有可能,但是这样做没有意义。为什么那个 Person 属性会困扰你?
【解决方案2】:

刚刚回复here

【讨论】:

  • @EricHerlitz 你知道什么比投反对票更有效率吗?实际上正在编辑答案。
  • 好吧,每当帖子更新时,我都会解除该 dv。有一些可以接受的链接,即到 MS 文档,但引用 google 组中的内容可能与技术种族灭绝相提并论,因为它是地球上最糟糕的地方,因为它实际上帮助人们并为 SO 真正擅长的信息提供清晰度。更新您自己的答案,否则 dv 将保留。
  • 埃里克,你认为我对我 3 年多前写的一篇帖子投反对票感到很在意吗? IIRC,OP在这里和小组中交叉发布,我首先在那里回答。如果您认为通过被动攻击使 Stackoverflow 变得更好,请继续相信这一点。
猜你喜欢
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多