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();
- 我得到的从数据库
- 我改变它...现在如果会话被刷新,将是持久的实体坚持在数据库
- 我做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;
}
我如何能实现验证,可以在数据库中查询的东西?
可能的解决办法是,以验证之前,我作出持久化对象的任何变化,但这是这样的做痛必须有一个更好的办法。感谢您的帮助。
我仍然想不通“所以问题是,Entity.Validate()检查正确inputed数据的数据库,并因为交易将提交甚至session.Get(),改变实体被保存(有效或无效) 在那里。”请详细说明 ! – Gopal
tnx的兴趣,更新的原始问题与澄清... –