【问题标题】:SaveChanges throws validation error in for loopSaveChanges 在 for 循环中引发验证错误
【发布时间】:2016-05-05 13:28:01
【问题描述】:

我有一个实体Candidate

public class Candidate
{
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }

    public int Age { get; set; }
}

现在我有一个candidates 的列表,我遍历列表并分别保存它们。现在列表中的某些项目与Candidate 模型上给出的验证不匹配。

var dbContext = new TestDbContext();

var list = new List<Candidate>
{
     new Candidate { Name = "", Age = 20 },
     new Candidate { Name = "Tom" , Age = 25 }
};


foreach (var item in list)
{
     try
     {
          dbContext.Candidates.Add(item);
          dbContext.SaveChanges();
     }
     catch (Exception)
     {
          // Handle exception
     }
}

显然,第一项将引发验证错误,即

姓名是必填项。

但列表中的第二项显然满足验证要求,但我再次收到验证错误,即

姓名是必填项。

我在这里做错了什么,为什么代码会这样?

【问题讨论】:

  • 一旦添加了一个item,它还在dbContext中;遇到异常时删除 Catch 中的项目
  • 我要做一个 dbContext.Candidates.Remove(item) ???
  • 或者你可以有 var dbContext = new TestDbContext();在for循环内
  • 不,这对我不起作用,我使用存储库和其他东西 :)
  • 删除工作了吗?

标签: c# asp.net-mvc entity-framework entity-framework-6


【解决方案1】:

只需将finally 块添加到您的Try Catch,如下所示:

try
{
    dbContext.Candidates.Add(item);
    dbContext.SaveChanges();
}
catch (Exception)
{
    // Handle exception
}
finally
{
    dbContext.Candidates.Remove(item);
}

【讨论】:

  • 会提交吗?我没有尝试,但我认为您必须在 Remove() 之后调用 SaveChanges,不是吗?
  • @AliaksandrBortnik 好吧无论是否有异常,finally 块中的代码都会被执行所以如果你在Remove 之后调用SaveChanges,它也会删除DB中正确插入try块的项目,这不是我们想要的。我们只需要从dbContext 中删除该项目,这样catch 块就不会重新抛出异常。
  • 没错,有道理。清理只是为了一个上下文。如果尚未成功将其添加到上下文中,则不确定您的计划。
猜你喜欢
  • 1970-01-01
  • 2014-03-24
  • 1970-01-01
  • 2011-12-30
  • 2017-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多