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始终使用此第一个查询?