外部キー関係でEntity Framework Code Firstを使用しています。アプリケーションでエンティティ ICollection からオブジェクトを削除する方法を調査しています。
子関係を持つエンティティがある場合、Add メソッドを使用してオブジェクトを ICollection に直接追加できます。remove を使用すると、エラーが発生します
System.InvalidOperationException が発生しました Message=The operation failed: 1 つ以上の外部キー プロパティが null 非許容であるため、リレーションシップを変更できませんでした。リレーションシップに変更が加えられると、関連する外部キー プロパティが null 値に設定されます。外部キーが null 値をサポートしていない場合は、新しい関係を定義するか、外部キー プロパティに別の非 null 値を割り当てるか、関連のないオブジェクトを削除する必要があります。
これは、コレクションの削除が外部キーを無効にすることによってのみ関係を削除するためであることを理解しています。エンティティにビジネス ロジックを記述し、削除できるようにしたいと考えていました。
そのため、リポジトリからルート エンティティを取得します。たとえば、OrderRepository から注文し、エンティティの特定のメソッドを呼び出します。たとえば、Order.AddOrderline(Orderline orderline)
これにより OrderLine が Orders に追加されます。virtual ICollection<OrderLine> OrderLines
Order.CancelOrderline(int orderLineId)
ただし、単純に ICollection から削除すると、貯蓄の変更でエラーが発生するため、次のようなコードを書くことはできません。
オブジェクトコレクションを操作するだけでこれを達成する方法はないようです。明らかに、コンテキストから直接削除できます。しかし、私はそれをエンティティの一部にしたいと思います。Entity Framework の SaveChanges イベントで、外部キーのない特定のエンティティをクリーンアップできますか? 外部キーが null の場合にどのエンティティを削除できるかを EF に伝える必要があることは明らかです。
現在、リポジトリ パターンを使用しているため、コントローラーはコンテキストにアクセスできません。明らかに、OrderLine リポジトリーまたは Order リポジトリーの remove OrderLine メソッドを使用できます。ただし、永続化メカニズムを参照せずにエンティティにコードを記述できるかどうかは疑問です。
考え?私たちはこれについてすべて間違っていますか?他の ORM では、子コレクションから削除できますか?