私のアプリケーションでは、インターフェイスを使用すると、ユーザーはEntityFrameworkモデルでエンティティを作成および削除できます。すべての変更はに追加されObjectContext
、ユーザーが[保存]を選択した場合にのみ保存されます。
私の質問は、次の簡単な例を使用して行うのが最適です。
2つのエンティティタイプ間に外部キー関係があります。これをここで呼び出しParent
ますChild
。SQLiteのデータベースは、次のように宣言されています。
CREATE TABLE Parents (ID INTEGER PRIMARY KEY);
CREATE TABLE Children
(
ID INTEGER PRIMARY KEY,
ParentID INTEGER NOT NULL
CONSTRAINT FK_ChildrenToParents REFERENCES [Parents](ID)
ON DELETE CASCADE ON UPDATE CASCADE
)
次に、そのデータベース上にEntity Frameworkモデルを構築し、それに対して次のアクションを実行します(以下のコードを参照)。
- 作成する
Parent
- 保存する
- を削除します
Parent
Parent
元のID番号と同じID番号で新しいものを作成します- を作成
Child
し、新しいParent
のID番号を提供します - 保存(失敗)
demoDBEntities entities = new demoDBEntities();
Parent originalParent = new Parent { ID = 1 };
entities.Parents.AddObject(originalParent);
entities.SaveChanges(); // First Save
entities.Parents.DeleteObject(originalParent);
Parent newParent = new Parent { ID = 1 };
entities.Parents.AddObject(newParent);
Child newChild = new Child { ID = 2, ParentID = 1 };
entities.Children.AddObject(newChild);
entities.SaveChanges(); // Second Save
2回目の呼び出しで次のエラーが発生しますSaveChanges()
:
"Unable to insert or update an entity because the principal end of the 'demoDBModel.FK_Children_0_0' relationship is deleted."
問題は、Entity Frameworkが新しいChild
アイテムをアイテムにリンクし、originalParent
アイテムが削除されてアイテムに置き換えられるnewParent
ことです。これはうぬぼれているように聞こえるかもしれませんが、私のアプリケーションでは非常に自然に発生します。
この問題を回避する方法はありますか?
PS:DBエントリのID番号を再利用するのは悪い習慣ですが、私の場合、ID番号は資産番号であり、理論的には再利用できます。とは言うものの、上記のシナリオは通常、クライアントが障害を作成しParent
、それを削除し、再作成してから、Child
アイテムを作成した場合に発生します。