c# - 一个图是否可以从 ObjectContext 分离并重新附加到另一个图?

标签 c# entity-framework

我尝试了以下方法来分离实体对象图,然后将其附加到新上下文:

// 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);

这种方法有两个问题:

  1. 分离所有实体对象后,newParent.Children变为空
  2. 重新附加时会引发 InvalidOperationException,提示“一个实体对象不能被 IEntityChangeTracker 的多个实例引用”。

有谁知道如何从 ObjectContext 中正确分离图形,然后将其重新附加到另一个图形?

更新:

对我来说是个好消息,我想出了如何在同一个 ObjectContext 中更改底层数据库连接,所以我不再需要分离/附加。如果有人感兴趣,我是这样做的(这里我使用 SQLite 并更改数据库文件):

var sc = ((EntityConnection)ctx.Connection).StoreConnection;
sc.ConnectionString = @"Data Source=" + newFile + ";";

我会接受 Ladislav 的回答,因为它似乎是正确的,并回答我提出的问题。

最佳答案

您必须创建整个图的深度克隆并将其附加到另一个上下文。深度克隆是通过序列化创建的。常见的方法是使用 DataContractSerializer:

var serializer = new DataContractSerializer(typeof(Parent));
serializer.WriteObject(stream, attachedEntity);
stream.Seek(0, SeekOrgin.Begin);
detachedEntity = (Parent)serializer.ReadObject(stream);

要实现此功能,您的实体不得包含循环引用(Parent 具有指向 Child 的导航属性,Child 具有指向 Parent 的导航属性)或者您必须使用 DataContract(IsReference=true)实体上的 DataMember 属性通知序列化程序它必须跟踪引用以解决循环引用问题。

关于c# - 一个图是否可以从 ObjectContext 分离并重新附加到另一个图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11599526/

相关文章:

entity-framework - EF 急切加载多个子子集合

c# - 服务定位器反模式适用于工厂注册

c# - 用于显示数据库项目的最佳控件是什么?

c# - 模拟 ApiController SignalR 广播

c# - java脚本到C#的回调,c#和java脚本之间的异步编程

c# - Entity Framework - 存储库和工作单元 - 我这样做对吗?

c# - Entity Framework 4.0 : Method cannot be translated into a store expression

c# - 如何使用ORM + LINQ 组合键查询?

entity-framework - 如何使用 Entity Framework 从数据库实现自定义对象具体化

c# - 根据使用的构造函数有选择地公开方法?