我的问题是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
但是我认为它应该更加一致:所有数据修改(添加,更新,删除)都应该立即进行,或者在提交事务时进行。 难道我做错了什么?
答案 0 :(得分:0)
检查文档9.6. Flush
会话始终按以下顺序执行SQL语句(在刷新期间):
SQL语句按以下顺序发出
所有实体插入,以相同的顺序使用ISession.Save()保存相应的对象
所有实体更新
所有馆藏删除
所有集合元素的删除,更新和插入
所有集合插入
所有实体删除,使用ISession.Delete()删除对象的顺序相同,
因此,我们所能做的就是真正的删除和刷新,然后再插入/保存。
如果我们将其混合使用,则始终使用上述过程