2011-03-22 88 views
0

我在嘗試刪除描述兩個不同表中的行之間關係的對象時遇到了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] 

爲什麼試圖先更新角色?

回答

2

因爲你正在做

user.UserRoles.Remove(userrole); 

用戶是一個管理實體的NHibernate將更新,就像你看到的。

+0

我承認失敗..嘆氣。謝謝! – Max 2011-03-22 20:58:57

1

這是第一次更新,因爲的UserRole這是你做什麼第一:

instance.UserRoles.Remove(userrole); 
user.UserRoles.Remove(userrole); 

相反,從協會刪除之前刪除的角色。

此外,也沒有必要:

session.Update(user); 
session.Update(instance); 

當session被同步,他們將被更新。而且,這是無效的,因爲Update意味着與解除關聯的實體一起使用。

+0

感謝大家,對NHibernate的一些洞察力可以幫助我理解「邏輯流」。 NHibernate「模型」的最佳資源是什麼? – Max 2011-03-22 21:01:29

+0

您可以查看文檔:http://nhforge.org/doc/nh/en/index.html或NHibernate in Action:http://www.manning.com/kuate/。 – eulerfx 2011-03-22 21:17:14