这是我的场景:
我正在使用 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/