gpt4 book ai didi

nhibernate:如何设置使用数据库中数据的实体验证?

转载 作者:行者123 更新时间:2023-12-02 05:09:56 24 4
gpt4 key购买 nike

我已经设置了 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. 我改变它...现在如果 session 被刷新,它将被持久化在数据库中
  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. 从数据库中获取原始实体
  2. 将其克隆(复制所有数据)到新实例
  3. 修改并验证新实例
  4. 如果验证成功,将所有内容从新实例复制到原始实例并保存

仍在寻找更好的解决方案。

关于nhibernate:如何设置使用数据库中数据的实体验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6774536/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com