是否有人对.SaveChanges()方法的使用有很好的了解?

尝试在数据上下文对象上使用.SaveChanges()方法时,我遇到各种问题。我正在从现有数据源中获取数据,创建适当的EntityFramework/DataService对象,用数据填充这些创建的对象,将这些对象添加到上下文中,然后通过调用.SaveChanges保存该数据。

我提出的场景(以及与之相关的问题)就这样……在每种情况下,我都有一个foreach循环,该循环从DataTable中的行获取数据并生成对象,并将它们附加到上下文中。他们去。 (注意:三个对象是通过SetLink调用附加的一个“成员”和两个“地址”)-基本上,这是一种转换工具,用于从一个数据存储中获取数据并将其按摩到Data Services公开的数据存储中。

  • 在foreach循环结束时(即循环外)一次不带任何参数调用.SaveChanges()
  • OutOfMemory错误,大约占总数的1/3(90,000个保存中的30,000个)-尽管每个保存项都是对数据库的单独SQL调用,但不确定怎么办呢?
  • 每个循环调用一次.SaveChanges(),不带任何参数
  • 可以,但是要花绝对的时间(8小时保存90,000次)
  • 在foreach循环结束时调用一次.SaveChanges(SaveChangesOption.Batch)
  • 同样的OutOfMemory错误,但没有任何保存到数据库
  • 每个循环调用一次.SaveChanges(SaveChangesOption.Batch)
  • 404未找到错误
  • 每10个循环调用一次.SaveChanges(SaveChangesOption.Batch)
  • 400错误的请求错误(有时)
  • 多次发送后
  • OutOfMemory
  • 每个循环一次创建上下文的随机尝试,或者在循环开始时将其作为变量,或者将其作为可用的私有(private)成员变量。
  • 不同的结果,无法量化,没有一个真的那么好

  • 像这样进行大量数据加载时,从客户端对象调用.SaveChanges()的首选方法是什么?我对.SaveChanges()的工作方式不了解吗?任何人都可以提供有关如何一次使用此功能以及通过数据服务保存数据的限制(如果有)的更多详细信息吗? .SaveChanges()方法调用周围是否有最佳实践? .SaveChanges()方法调用上是否有任何特别好的文档?

    最佳答案

    我没有使用EntityFramework的丰富经验(只是一些随机实验),您是否尝试过每n次调用.SaveChanges()?

    我的意思是这样的:

    int i = 0;
    foreach (var item in collection)
    {
        // do something with your data
        if ((i++ % 10) == 0)
            context.SaveChanges();
    }
    context.SaveChanges();
    

    我知道这很丑陋,但这是我想出的第一个可能的解决方案。

    关于entity-framework - 在ADO.Net数据服务中使用.SaveChanges()方法的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/190066/

    10-13 08:49