在保存和从上下文中删除之前验证实体

Posted

技术标签:

【中文标题】在保存和从上下文中删除之前验证实体【英文标题】:Validating entities before saving and removing from context 【发布时间】:2016-05-26 01:35:11 【问题描述】:

是否可以在调用SaveChanges 之前验证我已经添加到上下文中的实体并删除无效的实体,这样我就不会在保存时获得EntityValidationErrors

我有一个大约 3k 实体的列表,其中一些包含无效数据,阻止保存所有其他实体。我不想单独保存每个实体,而是忽略那些有错误的实体。

试图找到解决方案,我发现您可以禁用验证。如果我这样做了,SaveChanges 会忽略无效的并保存其他的吗?

Context.Configuration.ValidateOnSaveEnabled = false;

然而,我更愿意调用一些方法来调用实体验证并将其从上下文中删除。或者甚至可以在将实体添加到上下文之前对其进行验证?这样就更好了。

【问题讨论】:

【参考方案1】:

直接的解决方案是在保存之前验证它们,并分离那些有错误的实体。

foreach (var error in dbContext.GetValidationErrors())

    dbContext.Entry(error.Entry).State = EntityState.Detached;

但这更像是一种解决方法。 IMO 您应该更早地避免验证错误(例如在 api 层中),而不是阻止保存在数据层中。

【讨论】:

是的,我的意思是它就像一种解决方法。我将记录无效数据并稍后查找错误,但如果至少可以保存一些数据,那就太好了,否则一个无效实体会使整个系统瘫痪。预防和预测每一种可能的错误并不总是那么容易。这应该是最后的错误检测和预防手段。【参考方案2】:

使用 ViewData.ModelState.Errors 查找模型属性;

  foreach (var item in ViewData.ModelState.Keys)
            
                int err=ViewData.ModelState[item].Errors.Count();
                if (err.Equals(1))
                
                  // Add property name in a list 
                
            

在此之后使用排除这些属性

 db.Entry(model).State = EntityState.Modified;
 db.Entry(model).Property(x => x.Token).IsModified = false;

【讨论】:

这是一个有趣的方法。在这种情况下,它对我没有帮助,但很高兴知道我可以禁用特定属性。我会保存它以供将来参考;-)

以上是关于在保存和从上下文中删除之前验证实体的主要内容,如果未能解决你的问题,请参考以下文章

不保存上下文的 CoreData 保存

自定义验证期间神奇记录核心数据中的上下文保存问题

MagicalRecord:删除后保存上下文太长

EF6基础系列(十)---离线场景保存实体和实体图集

Swift 3 Core Data - 如何同步保存上下文?

UIManagedDocument - 验证核心数据实体