NHibernate-删除行推迟到Commit(),但不添加行。

时间:2018-07-31 12:43:20

标签: c# nhibernate

我的问题是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都具有相同的登录值,但是我在添加用户2之前删除了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()]'

方法的添加和删除在通用存储库中实现,下面向您展示代码:

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);
    }

我试图在Google中找到NHibernate为何会这样,但是我找不到解释。这是错误还是预期的行为?

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

    //_session.Flush(); unlocking this helps

但是我认为它应该更加一致:所有数据修改(添加,更新,删除)都应该立即进行,或者在提交事务时进行。 难道我做错了什么?

1 个答案:

答案 0 :(得分:0)

检查文档9.6. Flush

会话始终按以下顺序执行SQL语句(在刷新期间)

  
      
  • SQL语句按以下顺序发出

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

  •   
  • 所有实体更新

  •   
  • 所有馆藏删除

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

  •   
  • 所有集合插入

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

  •   

因此,我们所能做的就是真正的删除和刷新,然后再插入/保存。

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