nhibernate: как настроить проверку сущности, которая использует данные из базы данных? - PullRequest
3 голосов
/ 21 июля 2011

Я настроил 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();
  1. Я получаю постоянную сущность из базы данных
  2. Я изменяю это ... теперь, если сессия очищена, она будет сохранена в базе данных
  3. Я делаю 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;
    }

Как я могу добиться проверки, которая может проверять вещи в базе данных?

Возможное решение - проверить, прежде чем я внесу какие-либо изменения в постоянный объект, но это такая боль, для этого должен быть лучший способ. Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 27 июля 2011

Решение, которое я нашел, очень некрасиво, но оно работает:

  1. получить исходную сущность из базы данных
  2. клонировать его (скопировать все данные) в новый экземпляр
  3. изменить и проверить новый экземпляр
  4. если проверка в порядке, скопируйте все с нового экземпляра на оригинал и сохраните

Тем не менее, все еще ищем лучшее решение.

...