嘗試保存屬於多對多關聯的對象時,出現TransientObjectException異常。我有點理解爲什麼會發生這種情況,但想知道如何正確完成我正在嘗試做的事情。如何正確更新與Transient對象之間的NHibernate多對多關係? TransientObjectException
我所要做的,概括地說:
我的應用程序的用戶列表和角色的列表。用戶可以分配給多個角色,角色可以分配給多個用戶。有一個管理員可以執行這些分配的網頁,分配可以在兩個方向完成(例如,管理員可以選擇一個用戶,然後爲其添加角色;或者選擇一個角色並向其添加用戶)。
例如,假設管理員點擊用戶「Alice」上的「編輯」。管理員將看到可用角色列表以及已分配給Alice的角色列表。管理員然後爲Alice分配一個新角色並點擊「保存」。
在服務器上,從客戶端接收臨時用戶和分配的角色對象。如果我只將瞬態角色列表分配給用戶對象(例如,user.Roles = roles
),我可以更新得很好。然而,如果我在做這個任務之前碰巧從數據庫中讀用戶,我會在關聯的Role對象上得到一個TransientObjectException。
類定義:
映射:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="Role">
<id name="ID">
<generator class="guid"/>
</id>
<bag name="Users" table="Role_User" lazy="false" cascade="none">
<key column="RoleID" />
<many-to-many column="UserID" class="User" />
</bag>
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="User">
<id name="ID">
<generator class="guid"/>
</id>
<bag name="Roles" table="Role_User" lazy="false" cascade="none">
<key column="UserID" />
<many-to-many column="RoleID" class="Role" />
</bag>
</class>
</hibernate-mapping>
代碼保存(作品)
public void UpdateUser(User user, IList<Role> associatedRoles)
{
using (var session = _sessionFactory.OpenSession())
{
user.Roles = associatedRoles;
session.Merge<User>(user);
}
}
代碼保存(失敗)
public void UpdateUser(User user, IList<Role> associatedRoles)
{
using (var session = _sessionFactory.OpenSession())
{
User originalUser = session.Get<User>(user.ID);
// Code that does some audit reporting/logging
LogDifferences(originalUser, user);
user.Roles = associatedRoles;
session.Merge<User>(user);
}
}
對象是一個未保存的瞬態的實例 - 合併
我認爲問題在於你的會話將有兩個具有相同ID的用戶實例。嘗試使用session.Evict()從會話中刪除原始用戶。 –