0

IsVisibleDBから取得するエンティティにブール値を設定しようとしているコントローラーメソッドからDbEntityValidationExceptionが発生します。ページのチェックボックスの変更によるAJAX投稿への応答です。このコードは以前は機能していました。

var targetClass = db.Classes.FirstOrDefault(x => x.ID == cid);
targetClass.IsVisible = true;
db.SaveChanges();

これによりDbEntityValidationException、次のエラーが発生します。

The SchoolYear field is required.
The TuitionPlan field is required.

このコードをステップスルーすると、とは両方ともtargetClass.SchoolYear有効targetClass.TuitionPlanです。

質問は、EFがこれらのフィールドが欠落していると考える理由をどのように理解するのですか?

編集:これは(あまりにも)遅延読み込みに関係している可能性があります...両方の「欠落」フィールドを使用すると、エラーはなくなります。おそらく、深刻な問題が解決した理由がわからないことほど心配なことはありません。

var targetClass = db.Classes.FirstOrDefault(x => x.ID == cid);
targetClass.IsVisible = value;
int x = targetClass.TuitionPlan.ID;
x = targetClass.SchoolYear.ID;
db.SaveChanges();

ここで何が起こっているのか、そして将来これをどのように防ぐべきかを説明してくれる人が本当に必要です。

洞察をありがとう、エリック

4

1 に答える 1

0

nullに対してナビゲーションプロパティを検証するのは良い考えではないと思います。nullに設定されたナビゲーションプロパティは、関連するエンティティ(検証する条件)がないことを意味しますが、関連するエンティティがロードされなかったことを意味する場合もあります。さて、それを検証するためだけにデータベースに追加のクエリを送信すると、やり過ぎであり、パフォーマンスの問題を引き起こす可能性があります(まず第一に、データベースに多くのクエリを送信する可能性があります(エンティティをロードしていない場合を除く)追跡)実際に追跡する必要があるさらに多くのエンティティの追跡を開始します)。また、上記の理由により、検証が完了するまで、検証によって遅延読み込みが無効になることにも注意してください。これが、アプリで遅延読み込みが有効になっている場合でもエラーが表示される理由である可能性があります。検証中は無効になり、ナビゲーションプロパティにアクセスしても関連エンティティは読み込まれません。関連するエンティティが存在するかどうかを検証する場合は、外部キーを使用できます。関連するエンティティをロードする必要はなく、比較的簡単に実行できる必要があることに注意してください。

于 2012-11-11T05:30:38.167 に答える