我尝试了以下方法来分离实体对象图,然后将其附加到新上下文:
// 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);
这种方法有两个问题:
- 分离所有实体对象后,
newParent.Children
变为空 - 当重新附加说“一个实体对象不能被多个 IEntityChangeTracker 实例引用”时,会引发 InvalidOperationException。
有谁知道如何正确地将图形从 ObjectContext 中分离出来,并将其重新附加到另一个图形上?
更新:
好的,对我来说是个好消息,我想出了如何在同一个 ObjectContext 中更改底层数据库连接,所以我不再需要分离/附加。如果有人感兴趣,这就是我的做法(这里我使用 SQLite 并更改数据库文件):
var sc = ((EntityConnection)ctx.Connection).StoreConnection;
sc.ConnectionString = @"Data Source=" + newFile + ";";
我会接受 Ladislav 的回答,因为它似乎是正确的,并按照我的要求回答我的问题。