c# - NHibernate、验证逻辑和 AutoDirtyCheck

标签 c# asp.net-mvc nhibernate

这是我的场景:

我正在使用 nhibernate,在 IHttpModule(PreRequestHandlerExecute 和 PostRequestHandlerExecute)中打开和关闭 session 。

Ninject 负责将我的 session 注入(inject)我的所有存储库,我对此非常满意。

现在假设对我的一个实体进行更新(代码简化):

Controller :

User user = _userService.GetUser(id);
user.Name = "foo";
user.Email = "foo@bar.com";
user.Group = _groupService.GetGroup(idGroup);
if(_userService.Edit(user)) {
   RedirectToAction("Index");
}
else {
   return View(user);
}

服务:

if(ValidateUser(user) {
   return _rep.Update(user);
}
return false;

ValidateUser 正在执行验证逻辑并将任何错误插入到 IValidationDictionary 中,它是 Controller 中 ModelState 的包装器。

到目前为止一切顺利,我得到了所有错误(如果有的话)并且我可以在 View 中显示它们。


问题来了:

当我尝试保存一个有错误的用户时(例如没有名字),方法 _rep.Update(user) 永远不会被调用,但用户无论如何都会被保存。

谷歌搜索后我了解到 nhibernate AutoDirtyCheck,这意味着如果我更改内存中的实体,它将自动保存在数据库中。

我同意非常强大的功能,但由于我的 session 是在 PostRequestHandlerExecute 中提交的,我的无效实体无论如何都会被保存,这是我不想要的。

我尝试使用 unhaddins 消除这种行为,它起作用了,但是当我只保存父对象时,我的子对象不会自动保存:(


那怎么解决呢?

在调用 _userService.GetUser(id) 之前公开 ValidadeUser 并验证副本?

将验证逻辑放在别处?也许在实体类本身? (我非常喜欢分开!)。

非常感谢。

最佳答案

仅供引用 - 您可以将 Nhibernate session FlushMode 属性设置为 FlushMode.Never 以完全控制 NHibernate 何时将更新刷新到数据库。可能是你可以作弊,如果一个 Action 没有被授权——永远不要刷新,当响应结束时 nhibernate session 将终止(如果 session 没有消失,你真的应该驱逐修改后的对象,不过)

关于c# - NHibernate、验证逻辑和 AutoDirtyCheck,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1330357/

相关文章:

c# - 发票没有 LAN 自动化? [加1]

c# - ASP.NET MVC - 如何在登录页面上显示未经授权的错误?

c# - 通过 HttpClient 使用外部 REST Web 服务的存储库模式示例?

sql-server - 向 NHibernate 标准添加投影会阻止它执行默认实体选择

.net - Lightspeed 与 NHibernate

nhibernate - 流畅的 nhibernate 自动递增非键 (Id) 属性

c# - 我正在尝试使用 backgroundworker 但它不起作用 - 为什么?

c# - 如何改进我的第一个 OSS 项目

c# - SqlBulkCopy ColumnMapping 错误

asp.net - 使用Code First迁移发布我的数据库(程序包部署)