3

私のアプリケーションでは、インターフェイスを使用すると、ユーザーは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モデルを構築し、それに対して次のアクションを実行します(以下のコードを参照)。

  1. 作成するParent
  2. 保存する
  3. を削除しますParent
  4. Parent元のID番号と同じID番号で新しいものを作成します
  5. を作成Childし、新しいParentのID番号を提供します
  6. 保存(失敗)
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アイテムを作成した場合に発生します。

4

1 に答える 1

3

外部キープロパティを設定する代わりにParentID、ナビゲーションプロパティの1つを設定して(少なくとも1つは必要です)、1回の呼び出しだけを使用しAddObjectて、完全なオブジェクトグラフをコンテキストに追加することができます。

また:

//...
entities.Parents.DeleteObject(originalParent);

Child newChild = new Child { ID = 2 };
Parent newParent = new Parent { ID = 1, Children = new List<Child>{ newChild } };
entities.Parents.AddObject(newParent);

entities.SaveChanges();

または:

//...
entities.Parents.DeleteObject(originalParent);

Parent newParent = new Parent { ID = 1 };
Child newChild = new Child { ID = 2, Parent = newParent };
entities.Children.AddObject(newChild);

entities.SaveChanges();
于 2013-02-21T22:42:34.130 に答える