1

オブジェクトが存在しない子レコードへの参照を持っている場合、オブジェクトの子を更新できません。例えば。テーブル Car と CarColor には関係があります。Car.CarColorId >> CarColor.CarColorId 車にカラー レコードをロードすると、次のようになります。

 var result = from x in database.Car.Include("CarColor")
              where x.CarId = 5
              select x;

Car オブジェクトを取得します。これは Color オブジェクトです。少し前に CarColor が削除されたが、問題の Car レコードにはまだ CarColorId 値が含まれているとします。したがって、クエリを実行すると、CarColor レコードが存在しなかったため、Color オブジェクトは null になります。ここでの問題は、存在する別の Color オブジェクトをアタッチすると、ストアの更新が発生し、保存時にエラーが挿入されることです。

Car.Color = newColor
Database.SaveChanges();

コンテキストが存在しない色を削除しようとしているようです。どうすればこれを回避できますか?

4

3 に答える 3

0

EF ではなくデータベースに制約が適用されるため、保存しようとするとエラーが発生します。(私の知る限り)唯一の方法は、子供が存在することを確認することです。データベースの Car テーブルと CarColor テーブルの間に適切な外部キー制約を設定する必要があります。

于 2009-08-27T09:02:27.780 に答える
0

わかりました。これを回避するために 40 分を費やしましたが、直接ではありませんでした。関係制約を強制しないように Entity Framework を設定する方法はないようです。

なんらかの理由で「裸の」SQLにドロップダウンする必要があります。したがって、あなたの状況で私が行うことは、有効な車の色を参照する車でSQLビューを作成し(サブクエリカウントまたは同様のことを行います)、そこから有効な色参照で車をロードすることです.

有効な色を持たない車の色を設定したい場合は、Include() を使用せずに車をロードし、色オブジェクトを直接設定します。

于 2009-07-02T13:53:26.317 に答える
0

いいえ、EF は常に制約を適用します。私が考えることができる唯一の方法は、制約のない 2 番目のモデルを生成するか、強制したくない場合に使用される制約を削除することです。

しかし、ここでの正解は、違反を修正することだと思います。これらは、データベースで削除または修正する必要があります。最初に整合性の更新と削除のアクションで適切な FK 関係を持っていれば、そもそもそれを防ぐことができたでしょう。

于 2009-07-11T05:02:17.633 に答える