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

我做错了什么?- 在合并联系人之前,我是否必须将新的 ContactSecurity-Object 与引用的联系人一起额外保存?- 或者有更简单的方法吗?

谢谢你的帮助。

4

2 回答 2

2

您的问题不是由ContactSecurity. 您应该将级联设置更改为 -cascade="save-update"至少,以允许主类更新并在其属性中插入其他对象。

于 2012-03-11T07:46:22.430 回答
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()”。如果实体“contact”是一个持久对象,您可以在事务结束时使用“session.Flush()”,不要调用“session.Merge()”:

var contactSecurity = new ContactSecurity(Guid.NewGuid());
Session.Persist(contactSecurity);
contact.ContactSecuritys.Add(contactSecurity);
Session.Flush();
于 2012-03-10T11:47:41.363 回答