我在嘗試刪除描述兩個不同表中的行之間關係的對象時遇到了NHibernate的一些麻煩 - 多對多關係。刪除NHibernate映射的對象不工作 - 導致sql UPDATE
我有Users,CourseInstances和UserRoles,其中用戶映射到某些課程實例。用戶可以是許多課程實例的一部分,課程實例有許多用戶參加。
所有這些都由Fluent繪製。
User: HasMany(x => x.UserRoles).KeyColumn("UserId");
CourseInstance: HasMany(x => x.UserRoles);
UserRole:
References(x => x.User).Column("UserId");
References(x => x.CourseInstance).Column("InstanceId");
以上介紹他們是如何映射在一起,它是一個相當簡單的映射,雖然各有彼此相關的一些額外的信息,但一無所獲。
我嘗試運行下面的代碼:
using (var session = factory.OpenSession())
{
var user = session.Get<NData.User>(userId);
if (user == null)
throw new FaultException(new FaultReason("No user with that id found."));
var instance = session.Get<NData.CourseInstance>(courseInstanceId);
if (instance == null)
throw new FaultException(new FaultReason("No course instance with that id found."));
var userrole = session.CreateQuery(string.Format("from UserRole where User.Id = {0} and CourseInstance.Id = {1} and Role.Role = {2}", userId, courseInstanceId, role)).UniqueResult<NData.UserRole>();
if (userrole == null)
throw new FaultException(new FaultReason("That user is not present in that course instance with that role."));
instance.UserRoles.Remove(userrole);
user.UserRoles.Remove(userrole);
session.Delete(userrole);
session.Update(user);
session.Update(instance);
session.Flush();
}
然而,同花順拋出一個異常:
could not delete collection rows: [Giraffe.WebService.NHibernate.Data.User.UserRoles#8][SQL: UPDATE UserRoles SET UserId = null WHERE UserId = @p0 AND Id = @p1]
爲什麼試圖先更新角色?
我承認失敗..嘆氣。謝謝! – Max 2011-03-22 20:58:57