2012-03-10 28 views
0

我從數據庫加載Contact-objekt。接觸的物體有一個一對多的映射ContactSecurity:合併引用新對象的現有對象

<set name="ContactSecuritys" lazy="true" inverse="true" cascade="none" > 
     <key> 
      <column name="ContactId"/> 
     </key> 
     <one-to-many class="ContactSecurity"/> 
    </set> 

現在,我嘗試做:

contact.ContactSecuritys.Add(new ContactSecurity(Guid.NewGuid())); 
Session.Merge(contact); 

但這引發TransientObjectExcpeption「對象是一個未保存的瞬態的實例 - 保存合併前的瞬態的實例:Prayon.Entities.ContactSecurity」

我也曾嘗試

contact.ContactSecuritys.Add(new ContactSecurity(Guid.NewGuid()) {Contact = contact}); 
Session.Merge(contact); 

我做錯了什麼? - 我是否必須在合併聯繫人之前額外保存帶有引用Contact的新ContactSecurity-Object? - 還是有更簡單的方法來做到這一點?

感謝您的任何幫助。

回答

1

我認爲這是因爲「ContactSecurity」是一個新的瞬態對象。如果具有相同標識符的實體已被持久化,則可以使用「session.Merge()」,但不存在具有此類標識符的任何實體。您可以使用「session.Persist(ContactSecurity)」將臨時對象附加到Session。

var contactSecurity = new ContactSecurity(Guid.NewGuid()); 
Session.Persist(contactSecurity); 

contact.ContactSecuritys.Add(contactSecurity); 
Session.Merge(contact); 

一般來說,我不明白你爲什麼使用「session.Merge()」。 如果實體「接觸」是一種持久性對象,你可以使用「調用Session.flush()」,在交易結束時,並沒有所謂的「Session.merge()的」:

+0

With session.Persist()我有問題,contactSecurity中存在非null屬性 - 這將在Save-Event中設置。 – BennoDual 2012-03-10 12:14:43

2

你的問題不是引起的ContactSecurity。 您應至少將級聯設置更改爲 - cascade="save-update",以允許主類更新並在其屬性中插入其他對象。