使用序列化在实体框架中的两个 ObjectContext 之间复制实体

2023-12-07

Preface

我知道这可能已经被视为疯狂的问题,但我正在寻找最有教养的建议和PROVEN关于如何进行复印的建议ALL来自某个实体的数据(即所有实体和关系)ObjectContext到一个新创建的ObjectContext在另一家商店支持。See 在实体框架中“克隆”EntityConnections 和 ObjectContext看看我是如何设置的。


Intro

我见过在实体框架上克隆数据, but:

  1. 我在找整个辣酱玉米饼馅,即整个对象图:所有实体和关系。稍后,我将对对象图的哪些部分进行更细粒度的选择)

  2. 根据我下面的更新,我还没有使序列化起作用,但仅在特殊情况下起作用。我觉得这确实是一项不那么复杂的任务,但它却具有惊人的挑战性。我确实需要一些关于如何使其发挥作用的见解。


Step 1

好的,这就是我到目前为止所尝试的。

我知道当我使用Detach/Attach权力二人组,关系已经崩溃——我实际上想保留整个对象图。

因此,我正在考虑使用以下命令加载根实体MergeOption.NoTracking option:

var serializer = new DataContractSerializer(typeof(Root));

var query = (ObjectQuery<Root>) sourceContext.Roots
    .Include(d => d.Children.Select(c => c.MoreChildren.Select(r => r.EvenMoreChildren)))
    .Include(d => d.Children.Select(c => c.MoreChildren.Select(r => r.MoreAndMoreChildren)))
    .Include(d => d.Children.Select(c => c.MoreChildren.Select(r => r.Shizzle)));

foreach (var d in query.Execute(MergeOption.NoTracking)) {
    //sourceContext.Detach(d); // not needed
    Print(d);
    using (var ios = new MemoryStream()) {
        serializer.WriteObject(ios, d);
        ios.Seek(0, SeekOrigin.Begin);
        var dd = (Root) serializer.ReadObject(ios);
        //Console.WriteLine(string.Join(",", dd.EntityKey.EntityKeyValues.Select(k => k.Key + "=" + k.Value)));
        targetContext.Roots.AddObject(dd);
    }
}

鉴于我将实体加载为非跟踪,我不需要调用sourceContext.Detach(d)不再了。

The Print方法只是打印子对象树,它表明到目前为止一切进展顺利(我不会在这里显示它,因为它很大而且不相关)。

然而,现在整件事都在吹@serializer.WriteObject(ios, d)并显示以下消息:

“当一个对象返回时NoTracking合并选项,只有当EntityCollection or EntityReference不包含物体。”

(这有点道理,因为序列化器可能试图延迟加载相关实体。)

请记住,如果我不使用NoTracking,我必须分离实体,但那样我就会失去我的关系......


Step 2

当然我尝试过设置sourceContext.ContextOptions.LazyLoadingEnabled = false就在执行序列化循环之前,这修复了上面的错误,但这导致了臭名昭著的结果:

“无法添加或附加该对象,因为它EntityReference has an EntityKey属性值不匹配EntityKey对于这个物体。”

另外,请记住我仍然无法取消注释sourceContext.Detach(d)因为我加载了根NoTracking...


Step 3

我尝试过设置EntityKey = null在克隆实体的序列化之前,甚至在反序列化之后......一切都无济于事:

sourceContext.ContextOptions.LazyLoadingEnabled = false;

foreach (var d in query.Execute(MergeOption.NoTracking)) {
    //sourceContext.Detach(d);
    Print(d);
    d.EntityKey = null;
    using (var ios = new MemoryStream()) {
        serializer.WriteObject(ios, d);
        ios.Seek(0, SeekOrigin.Begin);
        var dd = (Root) serializer.ReadObject(ios);
        if (dd.EntityKey != null) {
            Console.WriteLine("Deserialized EntityKey: {0}", string.Join(",", dd.EntityKey.EntityKeyValues.Select(k => k.Key + "=" + k.Value)));
            dd.EntityKey = null;
        }
        targetContext.Roots.AddObject(dd);
    }
}

可疑的是,我什至不知道上面所说的例外是什么该死的“对象”。

我真的、真的、真的、真的注定要尝试用纯粹的 EF 方法来解决这个问题吗???

我彻底完蛋了吗?!?!?! :(


@khovanskiiªn - 事情是这样的。不管您如何评价 EF 的美妙之处,它的设计目的并不是为了实现这一点。你可以整天对锤子的神奇之处充满诗意,但如果你的问题需要扳手,那就无济于事了。

有很多解决方案可以满足您的需求,但不要使用 EF 并在 SQL 端执行,它甚至有一个奇特的名称。它称为 ETL 或提取/转换/加载,其唯一目的是从一组表中获取数据并将其移动到另一组表中,可能会调整之间的数据。

事实上,您可以将这些工具与客户端代码无缝集成。例如,SSIS 包可以从客户端代码执行,并将参数传递给它来控制处理哪些数据。

事实是,实体框架被设计为与单个上下文一起工作,并且它仅跟踪单个上下文上的关系和更改。一旦你将它分开,它就会丢失该信息。

更重要的是,实体框架对于此类事情效率极其低下,因为 EF 适用于单个实体,而不是批量/批处理操作。如果您有 100 万条记录,执行单个操作可能需要一整天的时间,而 sql 端批处理操作可能需要几分钟。

帮自己一个忙,研究一下 SSIS(Sql Server 集成服务)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用序列化在实体框架中的两个 ObjectContext 之间复制实体 的相关文章

随机推荐

  • LINQ 忽略重音和大小写

    使用 LINQ 通过以下方式过滤元素的最简单方法是什么Where方法忽略重音和大小写 到目前为止 我已经能够通过调用属性上的方法来忽略大小写 我认为这不是一个好主意 因为它为每个元素调用相同的方法 对吗 这是我到目前为止得到的 var re
  • 需要有关简单 MySQL 数据库设计的技巧

    我正在尝试使用 MySQL 为游戏制作一个简单的项目数据库 这是我的 3 张桌子的样子 items itemId itemName 0001 chest piece 0002 sword 0003 helmet attributes att
  • 如何生成常规 Excel 公式作为查询结果?

    我有一个大型且复杂的 Excel 查询 它可以按预期工作 但是 我正在实现一些实时数据验证功能 即不需要数据刷新 并且我需要在查询结果的一列中包含常规 Excel 公式 该公式将使用工作簿中的其他工作表执行实时数据比较 有意独立于查询本身
  • 在 AngularJS 服务之间共享数据

    有没有办法在 AngularJS 的服务之间共享数据 用例 来自不同服务的数据聚合例如 我想要一个从 REST 服务加载一些数据的 service1 然后 另一个 service2 将来自另一个 REST API 的附加数据添加到 serv
  • 如何在 apache htaccess 中为 angularjs 应用程序重写 url

    我使用的htaccess如下 RewriteBase RewriteEngine on RewriteCond REQUEST FILENAME s OR RewriteCond REQUEST FILENAME l OR RewriteC
  • iOS 中是否支持本机 JSON?

    iOS SDK 中是否有一个类可以从服务器解析 JSON 类似于 XML 的 NSXML 和扩展的 RSS 从 iOS5 开始 原生支持 JSON 无需第三方框架 这是由NSJSONSerialization 类
  • 如何在uwp平台中将图像转换为字节数组

    我需要将图像转换为字节数组以将其存储在数据库中 我还需要将该数组转换回图像 我做了谷歌研究 但找不到解决方案 因为UWP平台有些api不可用 我从这些文章中找到了解决方案外乡人 says 要将图像转换为 byte 我将使用存储文件的 Ope
  • 使用Python抓取动态内容

    我想使用 Python 来抓取网页上 您在寻找这些作者吗 框的内容 如下所示 http academic research microsoft com Search query lander 不幸的是 盒子的内容是由 JavaScript
  • Chrome打包应用程序-从Webview下载文件

    我正在努力让现有的 Ajax 风格的 Web 应用程序作为 Chrome 打包应用程序运行 Ajax 应用程序在打包应用程序内的 Web 视图中运行 并且大部分运行良好 Ajax 应用程序允许用户使用标准 HTML 5 上传和拖 放来上传文
  • 在 PHP5 中创建 Singleton 设计模式

    如何使用 PHP5 类创建 Singleton 类 Singleton class final class UserFactory private static inst null Prevent cloning and de serial
  • 固定div的CSS水平居中?

    menu position fixed width 800px background rgb 255 255 255 The Fallback background rgba 255 255 255 0 8 margin top 30px
  • 安卓中的动画?

    我是 android 新手 我需要了解 Android 中视图和视图组的基本动画 任何人都可以提供一些指导线来学习它 提前致谢 您可以先阅读官方指南到动画
  • JAIN API 和 JAIN SLEE API 之间的区别

    我正在阅读有关 SIP 的内容 发现有一个 java API JAIN SIP 可以开发基于 SIP 的应用程序 然后我还发现有JAIN SLEE和SIP servlet 我相信 JSLEE 和 SIP Servlet 是分别部署基于 JA
  • SQL Server 一轮又一轮的划分

    在存储过程中我有一个像这样的表达式 select some val in percents total val 100 some val 如果我使用Round像这样的函数 select some val in percents Round
  • 新手:在函数调用上挂起浏览器

    我刚刚开始学习 JavaScript 想知道为什么当我单击 调用函数 按钮时这个简单的代码片段会挂起 我缺少什么
  • 从 MATLAB 运行多进程应用程序

    我用 VC 编写了一个多进程应用程序 并尝试使用命令行参数执行它system来自 MATLAB 的命令 它可以运行 但只能在一个核心上运行 有什么建议吗 Update 事实上 它甚至没有看到第二个核心 我使用了 OpenMP 并使用了omp
  • 在windows和pycharm中设置SPARK-HOME路径变量

    我是 SPARK 的新手 并尝试在 Windows 中使用它 我能够使用 hadoop 的预构建版本成功下载并安装 Spark 1 4 1 在以下目录中 my spark directory bin 我可以运行 Spark shell 和
  • Google Android应用内购买“内容交付” 如何正确交付内容?

    我目前正在尝试对应用内购买进行编码 我一直在寻找有关 Google 无法处理的一些内容的最佳实践的文档 信息和教程 到目前为止我所做的 我正在运行一个计费服务来处理与 Google Play 的对话 该服务可以完成 示例 交易 并且我的应用
  • Python Kafka 消费者缺少轮询一些消息

    我的 Kafka 消费者的代码如下所示 def read messages from kafka topic my topic consumer KafkaConsumer bootstrap servers my host1 my hos
  • 使用序列化在实体框架中的两个 ObjectContext 之间复制实体

    Preface 我知道这可能已经被视为疯狂的问题 但我正在寻找最有教养的建议和PROVEN关于如何进行复印的建议ALL来自某个实体的数据 即所有实体和关系 ObjectContext到一个新创建的ObjectContext在另一家商店支持