合并引用新对象的现有Object

时间:2012-03-10 11:10:38

标签: .net nhibernate nhibernate-3

我从数据库加载了一个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? - 或者有更简单的方法吗?

感谢您的帮助。

2 个答案:

答案 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();