2016-08-18 34 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的代码后,我得出结论,没有办法改变这一点。