新しい子関係を既存の親オブジェクトに追加しようとすると、エンティティは親オブジェクトをmodifiedとして更新するのではなく、newとして挿入しようとします。重複したキーを挿入しようとしているというエラーが表示されます。
これは本当に私を困惑させています。モデルを新しいリレーションで更新するまで(コードではなくデータベースからの更新を介して)、このように動作しませんでした。同じ多対多パターンを持つ同じコンテキスト内の他のテーブルでは、このエラーは発生しません!
子オブジェクトをコンテキストに追加し、ナビゲーション プロパティではなく ID 値を慎重に設定すると、正常に保存されることがわかりました。ただし、修正プロセスでは子オブジェクトがナビゲーション コレクションに追加されないため、他の場所でロジックの問題が発生します。
私のモデルには、次のような多対多の関係があります。
option -< optionUnit >- 単位
Option オブジェクトと Unit オブジェクトの両方が存在し、コンテキストに読み込まれます。
通常、ブリッジ テーブルを作成し、ナビゲーション プロパティを次のように設定します。
bridge = new OptionUnit()
{
OptionUnitId = Guid.NewGuid(),
Unit = SelectedUnit,
Option = SelectedOption,
};
//Context.OptionUnits.Add(bridge); //added to context via the navigation properties
しかし、今回は、エンティティは SelectedOption を新規として挿入しようとしました (そのエンティティの状態は保存時に変更され、新規または切り離されていません)。
これを回避するには、ブリッジを作成して ID のみを設定する必要がありました。保存時にエラーは発生しませんが、予想どおり、修正によって SelectedOption.OptionUnits に自動的に追加されません。手動でコレクションに追加すると、保存エラーが再び発生します。
bridge = new OptionUnit()
{
OptionUnitId = Guid.NewGuid(),
//Unit = SelectedUnit,
UnitId = SelectedUnit.UnitId,
//Option = SelectedOption,
OptionId = SelectedOption.OptionId,
};
Context.OptionUnits.Add(bridge);
これは、オプション エンティティの関係でのみ発生しているようです。optionUnit >- Unit の間の他の関係には問題がなく、期待どおりに機能します。
関係に問題があるようですが、どこを見ればよいかわかりません。この動作の原因、修正方法、および今後発生しないようにする方法を知る必要があります....