我试图在NHibernate中围绕会话管理。如果我以正确的方式做到这一点,我不能100%确定。所以这就是我的问题。我正在测试NHibernate存储库以进行数据库操作(添加,更新,删除和加载)。我已经能够让我的单元测试工作于添加,更新和加载,但删除记录给我带来了很多麻烦。
以下是我对源代码的要点:
NHibernate Helper for DB config and mapping
Doctors Repository for DB operations
Unit Test for Doctors Repository DB operations
现在我认为问题在于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(),但它还没有解决问题。我得到了一个新的例外,说&#34;无法访问已处理的对象&#34;在刷新会议之后。
有什么提示可以帮我解决这个问题吗?
答案 0 :(得分:0)
我通过在CanDeleteDoctor()测试中更改方法repo.Delete(x)中的参数来修复它:
repo.Delete(doctors[0]);
到
repo.Delete(repo.GetByName(doctors[0].Name));
我认为问题在于医生[0]的Id与数据库中医生记录的Id属性不匹配。所以存储库最终没有删除任何内容。总结起来非常棘手。
我的测试在此次更改后100%通过。
编辑:如果有人知道这里发生了什么,我很乐意听到解释。