Вот мой сценарий:
Я использую nhibernate, открывая и закрывая сеанс в IHttpModule (PreRequestHandlerExecute и PostRequestHandlerExecute).
Ninject позаботится о том, чтобы внедрить мой сеанс во все мои репозитории, и я очень доволен этим.
Теперь предположим, что обновление одной из моих сущностей (упрощенный код):
Контроллер:
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, который является оболочкой для ModelState в контроллере.
Пока все хорошо, я получаю все ошибки (если они есть) и могу показать их в виде.
Здесь возникает проблема:
Когда я пытаюсь сохранить пользователя с ошибкой (например, без имени), метод _rep.Update (user) никогда не вызывается, но пользователь все равно сохраняется.
Находясь в поисках, мне стало известно, что nhibernate AutoDirtyCheck означает, что если я изменю сущность в памяти, она автоматически сохранится в базе данных.
Очень мощная функция, с которой я согласен, но поскольку мой сеанс фиксируется в PostRequestHandlerExecute, моя недействительная сущность в любом случае сохраняется, чего я не хочу.
Я пытался удалить это поведение, используя unhaddins , это сработало, но потом мои дочерние объекты не сохраняются автоматически при сохранении только родительского объекта: (
Так как это решить?
Сделать ValidadeUser общедоступным и проверить копию перед вызовом _userService.GetUser (id)?
Поместить логику проверки в другом месте? Может быть, в самом классе сущности? (Мне так нравится разлучаться!).
Заранее большое спасибо.