エンティティオブジェクトのグラフを切り離してから、それを新しいコンテキストにアタッチするために、次のことを試みました。
// create a context
var ctx = new TestEntities();
var parents = ctx.Parents;
// populate the graph
var newParent = new Parent {Nb = 1, Title = "Parent1"};
parents.AddObject(newParent);
newParent.Children.Add(new Child {Nb = 1, Title = "Child1"});
// put all entity objects in Unchanged state before detaching
ctx.SaveChanges();
// detach all entity objects
foreach (var objectStateEntry in ctx.ObjectStateManager.GetObjectStateEntries(~EntityState.Detached))
ctx.Detach(objectStateEntry.Entity);
// create a new context
ctx = new TestEntities();
// attach graphs to new context
foreach (var p in parents)
ctx.Attach(p);
このアプローチには2つの問題があります。
- すべてのエンティティオブジェクトをデタッチした後、
newParent.Children
空になります - 「エンティティオブジェクトはIEntityChangeTrackerの複数のインスタンスで参照できません」と再接続すると、InvalidOperationExceptionが発生します。
ObjectContextからグラフを適切にデタッチし、別のグラフに再アタッチする方法を知っている人はいますか?
アップデート:
幸いなことに、同じObjectContext内で基になるデータベース接続を変更する方法を理解したので、これ以上デタッチ/アタッチする必要はありません。興味のある方は、次のようにしてください(ここでは、SQLiteを使用してデータベースファイルを変更します)。
var sc = ((EntityConnection)ctx.Connection).StoreConnection;
sc.ConnectionString = @"Data Source=" + newFile + ";";
Ladislavの答えは正しいと思われるので受け入れ、質問されたとおりに私の質問に答えます。