【发布时间】:2012-06-03 15:35:22
【问题描述】:
我遇到了一个奇怪的问题。我有一个包含现有项目的数据库,我添加了一个新的验证规则,因此数据库中的一些项目不符合这个新规则。
我有一个循环查找记录,更改元素然后将其保存回数据库,如下所示:
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?
谢谢
【问题讨论】:
-
你检查过
for循环吗?
标签: c# entity-framework validation model