NHibernate-删除行被推迟到Commit(),但添加行没有



我的问题是NHibernate推迟了删除行的操作,而其他操作则没有推迟,并且会导致异常。在我的数据库中,我有一个具有唯一字段的用户表:登录。

我使用的是NHibernate 5.1.3,.NET版本4.6.1,C#。下面我粘贴了导致问题的代码片段:

var user1 = new UserEntity(0, "John1", "Smith1", "login1", "password2");
var user2 = new UserEntity(0, "John2", "Smith2", "login1", "password2");
using (var tx = _session.BeginTransaction())
{
//_session.FlushMode = FlushMode.Always; //this does not help 
_userRepository.Add(user1);
_userRepository.Delete(user1);
//_session.Flush(); uncommenting this helps 
_userRepository.Add(user2);
Console.WriteLine(tx.IsActive.ToString());
Console.WriteLine("_session.IsOpen.ToString() = " + _session.IsOpen.ToString());
tx.Commit();
}

user1和user2都有相同的登录值,但我在添加user2之前删除了user1。我在添加user1的行上放置了断点,我在SQL Server Profiler中看到,当调用add((方法时,行会立即添加,但当我调用Delete((时,它会被推迟;当调用tx.Commit((时,该行在SQL中被删除,并导致以下异常:

NHibernate.Exceptions.GenericADOException: 'could not insert: 
[WCFService.DAL.UserEntity][SQL: INSERT INTO [User] (FirstName, LastName, 
Login, Password) VALUES (?, ?, ?, ?); select SCOPE_IDENTITY()]'

方法Add和Delete在通用存储库中实现,下面我向您展示代码:

public class GenericRepository<T> : IRepository<T> where T : class
{
private readonly ISession _session;
(...)
public void Add(T entity)
{
_session.Save(entity);
}
public void Delete(T entity)
{
_session.Delete(entity);
}

我试图在谷歌上找到为什么NHibernate会这样做,但我找不到解释。这是错误还是预期行为?

尽管当我取消注释此行时会有所帮助:

//_session.Flush(); unlocking this helps

但我认为它应该更一致:要么所有类型的数据修改(添加、更新、删除(都应该立即发生,要么在提交交易时发生。我做错什么了吗?

检查文档9.6。冲洗

会话总是按以下顺序执行SQL语句(在刷新期间(

  • SQL语句按以下顺序发布

  • 所有实体插入,以相同的顺序使用ISession.Save((保存相应的对象

  • 所有实体更新

  • 所有集合删除

  • 所有集合元素删除、更新和插入

  • 所有集合插入

  • 所有实体删除,按照相同的顺序使用ISession.Delete((删除相应的对象

所以,我们可以做的是真正调用Delete和Flush,然后调用Insert/Save。

如果我们将其混合,则使用上述过程。。。始终

最新更新