C# 为什么不是';这不是简单的一对多关系吗?

C# 为什么不是';这不是简单的一对多关系吗?,c#,nhibernate,bidirectional,C#,Nhibernate,Bidirectional,我试图在NHibernate中建立一个简单的关联(这是我想从头开始利用它的第一个项目)——它看起来像是一个简单的、人为的、书本上的例子,但由于某种原因,我无法获得双向工作的关系 我有一个名为Contact的类,它可以包含许多地址 以下是简化的Contact类: public class Contact { // firstName, lastName, etc, etc omitted // ixContact is the identity value public virtual int

我试图在NHibernate中建立一个简单的关联(这是我想从头开始利用它的第一个项目)——它看起来像是一个简单的、人为的、书本上的例子,但由于某种原因,我无法获得双向工作的关系

我有一个名为Contact的类,它可以包含许多地址

以下是简化的Contact类:

public class Contact {

// firstName, lastName, etc, etc omitted

// ixContact is the identity value
public virtual int ixContact { get; set; }
public virtual ICollection<Address> addresses { get; set; }

}
以下是映射文件Contact.hbm.xml的相关部分:

<id name="ixContact">
    <generator class="hilo" />
</id>

<bag name="Addresses" inverse="true" cascade="save-update">
     <key column="ixContact" />
     <one-to-many class="Address />
</bag>


嗯,看起来你错过了通话
\u session.Save(第一次联系)tx.Commit()之前的code>

您确实需要明确设置关系的双方。

哎呀,对不起;我在示例中没有提到这一点,但在实际代码中没有。谢谢你指出这一点;我会立即更正这个问题。所以数据是正确的,但内存中的实体不是?当运行上面的代码示例时,数据库中的地址记录与联系人没有关联(存在联系人->地址的单向关联,但不存在地址->联系人的单向关联)。我的印象是(尽管我说过,我肯定会错的)NHibernate为您处理关联的镜像,只要您在映射文件中指定了反向。是的,您需要在内存中设置关系的两侧。检查这些问题@dotjoe我将把它放在一个答案中,并将其标记为“已接受”(因为这是正确的答案),但如果你想将此评论转换为答案,我将标记为已接受。哦,谢谢你回答我的问题!:)
<id name="ixContact">
    <generator class="hilo" />
</id>

<bag name="Addresses" inverse="true" cascade="save-update">
     <key column="ixContact" />
     <one-to-many class="Address />
</bag>
<id name="ixAddress">
    <generator class="hilo" />
</id>

<many-to-one name="contact" class="Contact" column="ixContact" />
_configuration = new Configuration();
    _configuration.Configure();
    _configuration.AddAssembly(typeof(Contact).Assembly);

    _sessionFactory = _configuration.BuildSessionFactory();

    _session = _sessionFactory.OpenSession();

    new SchemaExport(_configuration).Execute(false, true, false);

    Contact firstContact = new Contact { firstName = "Joey", middleName = "JoeJoe", lastName = "Shabadoo" };

    using( ITransaction tx = _session.BeginTransaction()) {

           firstContact.Addresses = new List<Address>();
           Address firstAddress = new Address { /* address data */ };

        firstContact.Addresses.Add(firstAddress);

      _session.SaveOrUpdate(firstContact);

      tx.Commit();
    }


    _session.Close();

    _session.Dispose();