【问题标题】:Clone Self-Tracking Entities in EF 4.0?在 EF 4.0 中克隆自我跟踪实体?
【发布时间】:2011-12-06 20:26:23
【问题描述】:

如何在 EF 4.0 中克隆自跟踪实体图?

谢谢

【问题讨论】:

    标签: c# .net entity-framework self-tracking-entities


    【解决方案1】:

    自跟踪实体是可序列化的,因此获取实体的深度克隆(深度克隆 = 图的克隆)的最简单方法是使用 DataContractSerializer 并对其进行序列化并立即反序列化。反序列化的实体将是您的图形克隆。

    【讨论】:

    • 我可能是错的,但我相信这将开始从数据库中提取数据,而不是将数据限制为您明确查询的数据,因为它将以不受限制的方式遵循所有导航属性。不管你喜不喜欢,你都会得到整个对象图。
    • @Merlyn:真正的 STE 不会发生这种情况,因为它们不支持延迟加载来避免这个问题。使用 POCO,您必须关闭代理创建才能使其正常工作。基于 EntityObject 的实体也支持这一点,因为它们是作为可序列化生成的。
    • “真实”是什么意思?比如,“真正的男人不使用那个功能”,或者它被证明是一个毫无价值/有害的功能?或者是其他东西?你能提供一个参考吗?不挑战你,我是来学习的:)
    • @Merlyn:Real STE 是由自我跟踪实体 T4 生成器创建的实体。 Here 是我的另一个答案,带有参考链接。
    • @Merlyn:STE 应该与 WCF 一起工作,而不是简单的 MVC 层,但我真的不喜欢 STE - 12
    【解决方案2】:

    当您说“克隆”时,您是指创建一个将被持久化的新实体,还是只是创建另一个“临时”实体,它是同一实体的内存副本?

    如果您想在内存中创建副本,您始终可以创建实体类的新实例,并复制字段。不会跟踪对它的更改,因为您尚未告知上下文。

    var newInstance = new SomeEntity() { SomeProperty = oldInstance.SomeProperty };
    

    如果您想创建一个将被持久化的新实体,那么只需执行您会执行的常规操作来插入新记录。例如:

    context.SomeEntities.Add(newInstance);
    

    您不能在逻辑上创建一个完整的副本来跟踪更改,而是引用同一个实例。您会采用哪个版本的对象?

    【讨论】:

    • 我想保留深层克隆,而不仅仅是在内存中复制
    • @user440916:然后看看我提供的第二段代码,它将内存中的副本作为另一个条目保存在数据库中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    • 2017-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多