我从数据库加载了一个Contact-objekt。 Object Contact具有与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);
我做错了什么? - 在合并联系人之前,是否必须使用引用的联系人额外保存新的ContactSecurity-Object? - 或者有更简单的方法吗?
感谢您的帮助。
答案 0 :(得分:2)
您的问题不是由ContactSecurity
引起的。
您应该至少将级联设置更改为 - cascade="save-update"
,以允许主类更新并在其属性中插入其他对象。
答案 1 :(得分:1)
我认为是因为“ContactSecurity”是一个新的瞬态对象。如果已经持久化了具有相同标识符的实体,则可以使用“session.Merge()”,但是没有任何具有此类标识符的实体。您可以使用“session.Persist(ContactSecurity)”将临时对象附加到会话。
var contactSecurity = new ContactSecurity(Guid.NewGuid());
Session.Persist(contactSecurity);
contact.ContactSecuritys.Add(contactSecurity);
Session.Merge(contact);
一般来说,我不明白你为什么使用“session.Merge()”。 如果实体“contact”是持久对象,则可以在事务结束时使用“session.Flush()”,而不要调用“session.Merge()”:
var contactSecurity = new ContactSecurity(Guid.NewGuid());
Session.Persist(contactSecurity);
contact.ContactSecuritys.Add(contactSecurity);
Session.Flush();