EF水合POCO的Deep Clone完整对象图

时间:2013-05-10 16:13:18

标签: c# .net entity-framework

似乎有很多关于C#深度克隆的信息,但是我试图克隆的对象正在被Entity Framework从数据库中拉出来。我的例子如下:

public class Parent
    {
        public int ParentID { get; set; }
        public string Name { get; set; }
        public virtual Person Owner { get; set; }
        public virtual ICollection<Child> Children { get; set; }
    }

    public class Child
    {
        public int ChildID { get; set; }
        public string Name { get; set; }
    }

我想制作Parent实体及其所有相关对象的副本,然后将这个新图保存到数据库中。我已经尝试使用Serializable方法作为详细的here,但由于延迟加载,子对象永远不会被包含(我上面的例子是微不足道的;实际上有很多孩子所以要急切加载所有这些都是不可维护的术语)。

我还尝试在每个POCO上放置一个DeepClone方法,如下所示:

public Parent DeepClone()
    {
        Parent clone = (Parent)this.MemberwiseClone();
        clone.Owner = this.Owner;

        clone.Children = new Collection<Child>();
        foreach (Child c in this.Children)
        {
            Child child = c.DeepClone();
            clone.Children.Add(child);
        }

        return clone;
    }

但clone.Children.Add(child)抛出InvalidOperationException“存储在代理中的实体包装器不引用同一个代理。”

有人可以帮我找到合适的解决方案。总结一下,我希望能够克隆EF水合POCO的完整对象图,然后将所有对象作为新数据保存到数据库中。

感谢您的帮助。

更新

正如Ladislav Mrnka所建议的那样,我使用ProxyDataContractResolver进入DataContractSerializer路线,以便与EF代理很好地协作。然而,这种方法似乎序列化图中的所有内容,这是有问题的,因为当将对象保存回数据库时,我得到已经存在的东西的副本。例如,假设Parent具有ParentType:我希望我的父克隆引用原始ParentType,而不是要创建新的ParentType。

所以我需要的是一种阻止ParentType成为序列化一部分的方法。我可以将ParentType属性标记为[IgnoreDataMember],但这种方法可能会导致错过属性。有没有办法配置DataContractSerializer,所以它只序列化我告诉它的类型?

0 个答案:

没有答案