私は、エンティティオブジェクトのグラフを切り離し、その後、新しいコンテキストにアタッチするために、次を試してみました:グラフをObjectContextから切り離して別のオブジェクトに再結合することはできますか?
// 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から適切に切り離して別のものに再接続する方法を知っている人はいますか?
UPDATE:私のために
[OK]を良いニュース、私は同じObjectContextは内基盤となるデータベース接続を変更する方法を考え出したので、私はもう取り付け/取り外しする必要はありません。誰もが興味を持っていた場合は、ここで私は(ここで私はSQLiteのを使用して、データベースファイルを変更する)それを行う方法は次のとおりです。
var sc = ((EntityConnection)ctx.Connection).StoreConnection;
sc.ConnectionString = @"Data Source=" + newFile + ";";
正しいと思えるし、それが頼まれたとして、私の質問に答えるように私は、ラディスラフの答えを受け入れるだろう。
グラフ内のオブジェクトを参照するアンドゥ/リドゥスタックがあり、ObjectContextを変更するとスタックをスクラップしたくないため、コピーを実行したくありません。同じグラフを使用し続けながら、コンテキストを変更するために使用できる他の方法、またはその接続オブジェクトのみを知っていますか? –
このような場合は、エンティティを切り離してリレーションを保持する方法が現在存在しないため、両方の操作で同じコンテキストを使用する必要があります。そのため、保持するためにコピーを行う必要があります。 –
はい、私はそれを恐れていましたが、ちょっと、私は基本的な接続文字列を変更できることを知りましたので、まずは分離/接続する必要はありません。 –