2011-07-21 118 views
3

我已经安装了nhibernate,但是在实际保存并提交到数据库之前,我在验证实体时遇到了问题。当我加载并更改持久化实体时,后续验证正在访问数据库,并通过这样做提交事务,从而在实际验证结果已知之前将实体保存在数据库中。nhibernate:如何设置使用数据库中数据的实体验证?

我使用Repository模式在.NET MVC的Web应用程序,它是这样的:

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"); 
    } 
} 

UPDATE:澄清 确定这里是代码:

// get persistent entity from nhibernate 
var entityOriginal = repository.GetById(id); 
entity.CopyDataToEntity(entityOriginal); 
ValidationResult validationResult = entityOriginal.Validate(); 
  1. 我得到的从数据库
  2. 我改变它...现在如果会话被刷新,将是持久的实体坚持在数据库
  3. 我做entity.Validate()从数据库中获取另一个实体和程序提交(因为你必须提交即使从数据库中获取)!...所以实体我试图验证数据库中被持久验证本身。

所以问题是,Entity.Validate()检查正确inputed数据的数据库,并因为交易将提交甚至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; 
    } 

我如何能实现验证,可以在数据库中查询的东西?

可能的解决办法是,以验证之前,我作出持久化对象的任何变化,但这是这样的做痛必须有一个更好的办法。感谢您的帮助。

+0

我仍然想不通“所以问题是,Entity.Validate()检查正确inputed数据的数据库,并因为交易将提交甚至session.Get(),改变实体被保存(有效或无效) 在那里。”请详细说明 ! – Gopal

+0

tnx的兴趣,更新的原始问题与澄清... –

回答

0

我已经找到了解决方案是非常难看,但它的工作原理:

  1. 从数据库中获取原始实体
  2. 克隆它(每个数据复制)到新实例
  3. 修改和验证新的实例
  4. 如果验证OK,一切由新实例复制到原来并保存

还在寻找一个更好的soluti虽然。

相关问题