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始終使用此第一個查詢?