NHibernate:多对多收藏

NHibernate:多对多收藏,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,客户可以有多个联系人。下面的代码正在运行,但是。。。首先删除此客户的联系人,然后再次插入。是否无法避免此删除并仅插入新的 <class name="Customer" table="Customer"> <id name="Id"> <generator class="native" /> </id> <property name="LastName" not-null="true" />

客户可以有多个联系人。下面的代码正在运行,但是。。。首先删除此客户的联系人,然后再次插入。是否无法避免此删除并仅插入新的

<class name="Customer" table="Customer">
    <id name="Id">
        <generator class="native" />
    </id>
    <property name="LastName" not-null="true" />

    <bag name="Contacts" cascade="all-delete-orphan" table="CustomerContact">
        <key column="Customer" not-null="true" />
        <many-to-many class="Contact"/>
    </bag>l
</class>

<class name="Contact" table="Contact">
    <id name="Id">
      <generator class="native" />
    </id>
    <property name="LastName" not-null="true" />

    <many-to-one name="Customer" column="Customer" not-null="true" />
</class>

public virtual void AddContact(Contact contact)
{
    Contacts.Add(contact);
    contact.Customer = this;
}

这通常发生在NH丢失有关集合的持久性信息时。它假定您更改了整个集合。为了高效地更新数据库,它删除一个查询中的所有项(删除…其中customer=5)并插入新项

您可能不会返回NH提供的收藏

典型错误:

  IList<Contact> Contacts
  {
    get { return contacts; }
    // wrong: creates a new List and replaces the NH persistent collection
    set { contacts = value.ToList(); }
  }
IList联系人
{
获取{返回联系人;}
//错误:创建新列表并替换NH持久集合
设置{contacts=value.ToList();}
}
顺便说一句,您应该使收集反向,因为它是联系人的冗余。客户关系:

<bag name="Contacts" cascade="all-delete-orphan" table="CustomerContact" inverse="true">
    <key column="Customer" not-null="true" />
    <many-to-many class="Contact"/>
</bag>

您使用的是一个
袋子
进行收集,袋子可能包含重复的物品,无法维持秩序,并且无法使用SQL清楚地识别袋子中的单个条目


这就是NH删除和插入所有指定实体的原因。如果符合您的要求,请使用
集合

更改后无需调用Update(customer)。它在会话中,会自动更新。属性Contacts是如何实现的?这不再是一个映射问题了?@Kris:到目前为止,映射看起来不错,只是缺少了一个反向,这应该不会导致这种行为。
<bag name="Contacts" cascade="all-delete-orphan" table="CustomerContact" inverse="true">
    <key column="Customer" not-null="true" />
    <many-to-many class="Contact"/>
</bag>