私は奇妙な問題を抱えています。既存のアイテムを含むデータベースがあり、新しい検証ルールを追加したため、データベース内の一部のアイテムがこの新しいルールに準拠していません。
次のように、レコードを見つけて要素を変更し、それをデータベースに保存するループがあります。
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()
{
}
}
何が起こっているかというと、foreach ループを循環する 100 レコードがあるとします。#27 が検証に失敗すると、その後のすべてのレコードが失敗し、更新されません!
これは非常に厄介です。どうすれば修正できますか? 検証エラーをクリアする方法はありますか? 他のすべてのループでエラーが続くのはなぜですか? db
ループの外で宣言されたからですか?そもそも ModelState.IsValid を渡すのはなぜですか?
ありがとう