NHibernate从内存SQLite数据库中删除记录的问题
本文关键字:删除 记录 问题 数据库 内存 SQLite NHibernate | 更新日期: 2023-09-27 17:49:30
我想把我的头围绕在NHibernate的会话管理。我不能百分百确定我的做法是否正确。这就是我的问题。我正在对NHibernate存储库的数据库操作(添加、更新、删除和加载)进行单元测试。我已经能够让我的单元测试为Add、update和load工作,但是删除记录给我带来了很多麻烦。
下面是我的源代码列表:
数据库配置和映射的NHibernate Helper
医生类映射
Doctors Repository for DB operations
医生存储库DB操作单元测试
现在我认为问题在于CanDeleteDoctor()测试的代码:
[Test]
public void CanDeleteDoctor()
{
using (DoctorsRepository repo = new DoctorsRepository())
{
try
{
repo.BeginTransaction();
repo.Save(doctors[0]);
Assert.IsNotNull(repo.GetByName(doctors[0].Name));
repo.Delete(doctors[0]);
Assert.IsNull(repo.GetByName(doctors[0].Name));
}
catch (Exception ex)
{
repo.RollbackTransaction();
Assert.Fail(ex.Message + "'n" + ex.StackTrace);
}
}
}
每当我运行这个测试时,我都会得到一个异常:
Test 'PrototypeSLM.Tests.DoctorsRepositoryTest.CanDeleteDoctor' failed:
Expected: null
But was: <PrototypeSLM.Entities.Doctors>
at NUnit.Framework.Assert.That(Object actual, IResolveConstraint expression, String message, Object[] args)
at NUnit.Framework.Assert.IsNull(Object anObject)
at PrototypeSLM.Tests.DoctorsRepositoryTest.CanDeleteDoctor() in c:'Users'Craig_2'Documents'Visual Studio 2012'Projects'PrototypeSLM'PrototypeSLM.Tests'Tests'DoctorsRepositoryTest.cs:line 100
Tests'DoctorsRepositoryTest.cs(105,0): at PrototypeSLM.Tests.DoctorsRepositoryTest.CanDeleteDoctor()
我有一种感觉,这与我如何在内存数据库上进行会话管理有关?我尝试在DoctorsRepository的Delete方法中添加_session.Flush(),但它没有解决这个问题。在刷新会话后,我得到了一个新的异常,说"不能访问一个已处置的对象"。
有什么提示可以帮我解决这个问题吗?我通过更改CanDeleteDoctor()测试中的repo.Delete(x)方法中的参数来修复它:
repo.Delete(doctors[0]);
repo.Delete(repo.GetByName(doctors[0].Name));
我认为问题在于doctors[0]的Id与数据库中doctors记录的Id属性不匹配。所以存储库最终什么也没删除。
修改后我的测试100%通过了。
编辑:如果有人知道这里到底发生了什么,我很想听到一个解释。