NHibernate清除关联-生成错误的查询
本文关键字:错误 查询 -生 清除 关联 NHibernate | 更新日期: 2023-09-27 18:02:55
假设我有以下模型:
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
所以这次不检查RoleId,只是删除whone集合。这是错误的!我有许多线程处理相同的数据,这第二个查询使我失去了关联。假设我们有一个单一角色的用户,同时由两个线程加载。一个线程首先添加新角色并保存它,现在第二个线程删除角色。然后尝试Save
将导致它删除不是单个关联,而是第二个刚刚由其他线程创建的关联。
在调查了NHibernate的代码后,我得出结论,这是无法改变的。