2016-08-18 57 views
0

假設我有以下型號:NHibernate的清算協會 - 錯誤查詢生成

public class User 
{ 
    public virtual int Id { get; set; } 
    public virtual ICollection<Role> Roles { get; set; } 
} 

public class Role 
{ 
    public virtual int Id { get; set; } 
    public virtual ICollection<User> Users { get; set; } 
} 

我讓他們通過加入許多一對多的關係,所以當我做這樣的事情:

user.Roles.Remove(role); 
Session.Save(user); 

NHibernate的會生成查詢:

DELETE FROM User_Role WHERE UserId = @p1 AND RoleId = @p2 

這是好的,除了當時role是最後一個項目Roles集合。那麼該查詢將是這樣的:

DELETE FROM User_Role WHERE UserId = @p1 

所以沒有檢查的角色ID這個時間,只是刪除whone集合。哪個是錯的!我有許多線程處理相同的數據,第二個查詢會導致我失去聯繫。假設我們有兩個線程同時加載單個角色的用戶。首先添加新角色並將其保存起來,現在第二個線程刪除角色。然後嘗試Save將導致它刪除沒有單個關聯,但也是其他線程創建的第二個關聯。

所以問題是:如何強制NH始終使用此第一個查詢?

回答

0

在調查NHibernate的代碼後,我得出結論,沒有辦法改變這一點。