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

是可以的,除了roleRoles集合的最后一项。然后查询看起来像这样:

DELETE FROM User_Role WHERE UserId = @p1 

所以这次不检查RoleId,只是删除whone集合。这是错误的!我有许多线程处理相同的数据,这第二个查询使我失去了关联。假设我们有一个单一角色的用户,同时由两个线程加载。一个线程首先添加新角色并保存它,现在第二个线程删除角色。然后尝试Save将导致它删除不是单个关联,而是第二个刚刚由其他线程创建的关联。

所以问题是:如何强迫NH总是使用第一个查询?

NHibernate清除关联-生成错误的查询

在调查了NHibernate的代码后,我得出结论,这是无法改变的。