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

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

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

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

Context.Configuration.ValidateOnSaveEnabled = false;

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

【问题讨论】:

    标签: c# entity-framework


    【解决方案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;
    

    【讨论】:

    • 这是一个有趣的方法。在这种情况下,它对我没有帮助,但很高兴知道我可以禁用特定属性。我会保存它以供将来参考;-)
    猜你喜欢
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    相关资源
    最近更新 更多