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(),但它没有解决这个问题。在刷新会话后,我得到了一个新的异常,说"不能访问一个已处置的对象"。

有什么提示可以帮我解决这个问题吗?

NHibernate从内存SQLite数据库中删除记录的问题

我通过更改CanDeleteDoctor()测试中的repo.Delete(x)方法中的参数来修复它:

repo.Delete(doctors[0]);

repo.Delete(repo.GetByName(doctors[0].Name));

我认为问题在于doctors[0]的Id与数据库中doctors记录的Id属性不匹配。所以存储库最终什么也没删除。

修改后我的测试100%通过了。

编辑:如果有人知道这里到底发生了什么,我很想听到一个解释。