2011-08-19 89 views
1

客戶可以有多個聯繫人。下面的代碼正在工作,但...此客戶的聯繫人將首先被刪除,然後再次插入。是不可能避免這種刪除,只需插入新的?NHibernate:多對多集合

<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; 
} 

當我做這個代碼兩次,加2個聯繫人:

Contact contact = new Contact() { LastName = "MyLastName" }; 
Customer customer = session.Get(customerId); 
customer.AddContact(contact); 
session.Update(customer); 

enter image description here

+0

更改後不需要致電更新(客戶)。它在會話中會自動更新。 –

+0

聯繫人如何實施? –

回答

2

您正在使用的bag你的收藏,一個包可以包含重複項,不維護順序,並且沒有辦法用SQL明確識別包中的單個條目。

這就是NH刪除並插入所有分配的實體的原因。如果它符合您的要求,請使用set

1

這種情況通常發生在新罕布什爾州損失了約集合持續性信息。它假定你改變了整個集合。爲了高效地更新數據庫,它將刪除一個查詢中的所有項目(刪除...,其中customer = 5)並插入新項目。

您可能不會返回NH提供的集合。

典型錯誤:

IList<Contact> Contacts 
    { 
    get { return contacts; } 
    // wrong: creates a new List and replaces the NH persistent collection 
    set { contacts = value.ToList(); } 
    } 

順便說一句,你應該收集逆,因爲它是一個冗餘的contact.Customer關係:

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

這不是更麻煩的映射嗎? –

+0

@Kris:到目前爲止映射看起來不錯,除了缺少的逆,它不應該導致這種行爲。 –