当前位置:  开发笔记 > 编程语言 > 正文

NHibernate更新无效

如何解决《NHibernate更新无效》经验,为你挑选了3个好方法。

我无法让我的更新工作.测试失败,我没有看到任何更新语句被发送到数据库.有人能告诉我我做错了什么吗?

这是我的存储库更新过程:

public void UpdateProject(Project proj)
{
    Session.Update(proj);
}

这是我正在尝试的单元测试:

[Test]
public void Can_Update_A_Project()
{
    var project = _projects[0];
    project.Name = "test project";

    repository.UpdateProject(project);

    var fromDb = repository.GetAProject(_projects[0].ID);
    Assert.AreEqual(project.Name, fromDb.Name);        
}

测试总是失败.我看到插入的测试数据,我看到测试的选择.我没有看到正在执行的更新.我错过了什么?

谢谢!



1> MrTelly..:

可能会发生一些事情.

1)更新失败了,NHibernate引发了一个被某个地方吞噬的异常 - 这可能会发生,具体取决于你配置的方式.所以在VS中确保所有异常都会导致中断.

2)更新正在缓存,而不是直接写入数据库 - 您可以强制使用数据写入 Repository.Flush();

3)你确定已经从数据库中读取了_projects [0] - 我假设这是在TestSetup中发生的吗?如果不是NHibernate将不会将其视为一个处于"控制"之下的对象.

顺便说一句 - 最好在测试中读取您要更改的数据,然后撤消该更改,将数据库重置为原始状态.这样,您的测试数据库将不会被您的测试更改.

BTW2 - 在上面的测试中,如果project.Name已经更新一次,即测试已成功运行.然后,即使更新本身失败,下次测试也会成功.一种避免这种情况的方法 - 将DateTime附加到project.Name,不要将其设置为固定值.


`Session.Flush()`会立即对DB进行写操作,并使测试按预期工作.在PROD代码中不建议调用`Session.Flush()`,但更好的做法是使用事务.如果没有明确的事务管理,NHibernate会隐式为您创建可能导致问题的事务.http://nhprof.com/Learn/Alerts/DoNotUseImplicitTransactions
我相信第二个选项(调用flush)确实是解决方案.:)

2> mookid8000..:

另一件事是:当您使用会话保存实体并使用实体的ID从同一会话加载相同的实体时,您将获得您保存的相同实例 - 无论是否已向其发出任何插入或更新数据库.

那是因为NHibernate的第一级缓存,它是属于会话的身份映射.

如果您希望测试检查实际写入数据库的内容,您可以这样做:

session.Save(someEntity);
session.Flush(); // forces the entity to be inserted
session.Clear(); // clears the session's identity map, thus
                 // detaching someEntity from the session

var loadedEntity = session.Get(someEntity.Id);

// now you may compare the fields of someEntity and loadedEntity
// to verify that they were actually persisted



3> Sean Carpent..:

ISession.Update在NHibernate中不提交对数据库的更改.它用于更新与用于检索实例的会话不同的会话中的瞬态实例(有关详细信息,请参见此处).刷新会话时,会将更改发送到数据库.默认情况下,会话以FlushOnCommit模式运行,这意味着在提交NHibernate事务时,对象的更改将被发送到数据库(有关不同刷新模式的详细信息,请参见此处).

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有