我有一个奇怪的问题。我有一个包含现有项目的数据库,我添加了一个新的验证规则,因此数据库中的某些项目不符合这个新规则。
我有一个循环,可以找到一条记录,更改一个元素,然后将其保存回数据库,如下所示:
foreach(int foo in bar)
{
Model model = db.Model.Find(foo);
model.updated = true;
if(ModelState.IsValid)
{
db.Entry(model).State = EntityState.Modified;
db.SaveChanges();
}
}
我认为对于不符合新验证规则的记录不会更新,因为ModelState.IsValid
不会通过。但情况并非如此,它会引发验证失败异常。所以我把它放进去,try catch
然后我想我会记录错误,这样我就知道哪些记录是无效的。所以它现在看起来像这样:
foreach(int foo in bar)
{
Model model = db.Model.Find(foo);
model.updated = true;
try
{
db.Entry(model).State = EntityState.Modified;
db.SaveChanges();
}
catch(Exception x)
{
// log error
if(ModelState.IsValid)
{
db.ErrorLogs.Add(errorLog);
db.SaveChanges();
}
}
}
这也会引发验证失败异常,我猜是因为try
未清除中的异常。很好,我决定尝试一下,而不是发现错误。所以它看起来像这样:
foreach(int foo in bar)
{
Model model = db.Model.Find(foo);
model.updated = true;
try
{
db.Entry(model).State = EntityState.Modified;
db.SaveChanges();
}
catch()
{
}
}
现在最终发生的事情是说我有 100 条记录通过 foreach 循环循环,如果 #27 验证失败后的每条记录都失败了,因此不会更新!
这非常严重,我该如何解决?有没有办法清除验证错误?为什么错误持续到所有其他循环?是因为db
在循环之外声明了吗?为什么它首先通过 ModelState.IsValid ?
谢谢