实体框架在克隆后附加异常

时间:2010-10-27 14:41:54

标签: wpf entity-framework binding

尝试了几个选项后,有一个允许使用ObservableCollections的选项来动态地使用Edit窗口和绑定更新它们,而不需要在对绑定控件进行更改时更新全局集合,到目前为止最好解决方案似乎是:克隆实体,分离旧实体,附加新实体,标记更新并保存。

但是oops,以下例外如下:

The relationship manager supplied by the object implementing IEntityWithRelationships is not the expected relationship manager.

有人知道如何解决这个问题吗?

b.t.w - 请不要使用序列化,也不要反映或使用Matthieu MEZIL  实体克隆从性能问题出发(需要几秒钟才能复制整个实体图)。

谢谢, 奥兰

2 个答案:

答案 0 :(得分:2)

我会质疑你的做法。 “需要几秒钟来复制整个实体图”应该响起一些警钟。听起来您将大部分数据存储在内存中。只是因为你不能意味着你应该这样做。我会尝试重新设计你使用延迟加载。

然而,话虽如此,您使用的是解耦实体(POCO方法)吗?这可能在这方面有所帮助,因为它们更多地与上下文分离,这可能使您可以灵活地将实体引入和引出上下文。

答案 1 :(得分:2)

上述答案(Slappy)引导我找到解决方案。以下是完整的解释:

  1. 为了编辑实体而不影响绑定到它的observables控件,我只想克隆实体,执行更改,将其附加到对象上下文并保存。但是当我使用默认的.NET MemberWiseClone()或我在其周围找到的任何其他克隆程序时,我没有成功,所谓的简单操作让我碰到了墙。

  2. 当我序列化对象时,我确实成功了,但有一个主要问题:序列化一个对象花了几秒钟,这是一个因性能问题而无法实现的事情。

  3. 然后Slappy的回答让我意识到我没有学到足够的对象上下文行为以及它如何处理实体模型。当我仔细查看文档并遵循实体行为时,我发现自己与自己发生了矛盾 - 我尝试在“实时”和“附加”上下文实体上执行深度克隆,这个事情需要几秒钟才能完成我的数据。

  4. 以下程序解决了我的问题:我从Matthieu MEZIL(http://msmvps.com/blogs/matthieu/archive/2008/05/31/entity-cloner.aspx)下载了(GREAT!)实体克隆,并使用CloneEntityWithGraph完全克隆了实体,但这一次有一个区别:我在尝试克隆它之前已经分离了实体。当然,实体立即用其所有图形克隆,以后可以将其应用于原始实体,如下所示。执行更改后,我使用以下代码成功保存更改:

    objectContext.ApplyCurrentValues(<ObjectSet Name>,<Cloned And Edited Entity>); objectContext.SaveChanges();

  5. 就是这样!该实体已成功保存到数据库中。

    我更倾向于采用POCO方法或将编辑硬编码为特定实体属性,因为它是通用的,并且(应该)通常适用于我的所有实体,而不包含任何特定的实体编码。

    感谢所有的帮助, 奥兰