在保存和从上下文中删除之前验证实体
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;
【讨论】:
这是一个有趣的方法。在这种情况下,它对我没有帮助,但很高兴知道我可以禁用特定属性。我会保存它以供将来参考;-)以上是关于在保存和从上下文中删除之前验证实体的主要内容,如果未能解决你的问题,请参考以下文章