Я настроил nhibernate, но у меня проблемы с проверкой сущности перед фактическим сохранением и фиксацией в базе данных. Когда я загружаю и изменяю постоянный объект, после него происходит проверка доступа к базе данных и, таким образом, происходит фиксация транзакции, что позволяет сохранить объект в базе данных до того, как фактический результат проверки станет известен.
Я использую шаблон репозитория в веб-приложении .NET MVC, и он выглядит так:
public ActionResult Edit(int id, Entity entity)
{
var repository = new EntityRepository();
// get persistent entity from nhibernate
var entityOriginal = repository.GetById(id);
// copy data from input entity to persistent entity
entity.CopyDataToEntity(entityOriginal);
// if validation ok save to database
// this validations is problematic becouse it needs info from database and uses transaction
ValidationResult validationResult = entityOriginal.Validate();
if (validationResult.IsValid())
{
repository.Save(entityOriginal);
// everything ok, redirect to view entity page
return RedirectToAction("view");
}
else
{
repository.Evict(prateciList);
foreach (var message in validationResult.ErrorMessages)
{
ModelState.AddModelError(message.Key, message.Value);
}
return RedirectToAction("pogledaj");
}
}
ОБНОВЛЕНИЕ: уточнение
хорошо, вот код:
// get persistent entity from nhibernate
var entityOriginal = repository.GetById(id);
entity.CopyDataToEntity(entityOriginal);
ValidationResult validationResult = entityOriginal.Validate();
- Я получаю постоянную сущность из базы данных
- Я изменяю это ... теперь, если сессия очищена, она будет сохранена в базе данных
- Я делаю entity.Validate (), который получает другую сущность из базы данных и фиксирует процесс (так как вам приходится фиксировать даже для извлечения из базы данных)! ... поэтому сущность, которую я пытаюсь проверить, сохраняется в базе данных во время самой проверки .
Таким образом, проблема в том, что Entity.Validate () проверяет базу данных на предмет правильности введенных данных, и, поскольку транзакция фиксируется даже в session.Get (), измененная сущность сохраняется (действительная или недействительная) прямо здесь.
Моя реализация репозитория классическая:
public virtual bool Save(T entity)
{
var session = SessionProvider.GetRequestSession(this.DatabaseName);
using (var transaction = session.BeginTransaction())
{
try
{
session.SaveOrUpdate(entity);
transaction.Commit();
}
catch (Exception ex)
{
_log.Error("Could not save object to database.", ex);
if (transaction.IsActive)
{
transaction.Rollback();
}
session.Close();
return false;
}
}
return true;
}
Как я могу добиться проверки, которая может проверять вещи в базе данных?
Возможное решение - проверить, прежде чем я внесу какие-либо изменения в постоянный объект, но это такая боль, для этого должен быть лучший способ. Спасибо за вашу помощь.