Entity framework 在ADO.Net数据服务中使用.SaveChanges()方法的最佳方式是什么?

Entity framework 在ADO.Net数据服务中使用.SaveChanges()方法的最佳方式是什么?,entity-framework,wcf-data-services,savechanges,Entity Framework,Wcf Data Services,Savechanges,关于.SaveChanges()方法的使用,有人有一些好的信息吗 在尝试对数据上下文对象使用.SaveChanges()方法时,我遇到了各种问题。我从现有数据源获取数据,创建适当的EntityFramework/DataService对象,用数据填充这些创建的对象,将这些对象添加到上下文中,然后通过调用.SaveChanges保存数据 我提出的场景(以及与之相关的问题)是这样的。。。在每个场景中,我都有一个foreach循环,它从DataTable中的行中获取数据并生成对象,在对象运行时将它们附

关于.SaveChanges()方法的使用,有人有一些好的信息吗

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

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

  • 在foreach循环结束时(即循环外部)调用一次不带任何参数的.SaveChanges()
    • OutOfMemory错误大约1/3(90000次保存中有30000次)-不确定这是如何发生的,尽管每个保存项都是对数据库的单独SQL调用,但有什么会耗尽内存
  • 每个循环调用一次不带任何参数的.SaveChanges()
    • 这是可行的,但绝对需要永远(90000次保存需要8小时)
  • 在foreach循环结束时调用.SaveChanges(SaveChangesOption.Batch)一次
    • 相同的OutOfMemory错误,但未保存到数据库
  • 每个循环调用.SaveChanges(SaveChangesOption.Batch)一次
    • 404未找到错误
  • 每10个循环调用一次.SaveChanges(SaveChangesOption.Batch)
    • 400错误请求错误(偶尔)
    • 几次写信后,我的记忆都消失了
  • 多次随机尝试在每个循环中创建一次上下文,或在循环开始时将其作为变量,或将其作为可用的私有成员变量。
    • 不同的结果,无法量化,没有一个真的那么好

在执行这样的大数据加载时,从客户端对象调用.SaveChanges()的首选方法是什么?关于.SaveChanges()的工作原理,我有什么不懂的吗?是否有人可以提供更多关于once应如何使用此功能的详细信息,以及通过数据服务保存数据的限制是什么(如果有)?关于.SaveChanges()方法调用有什么最佳实践吗?关于.SaveChanges()方法调用是否有特别好的文档?

我也在一个小项目上使用EntityFramework,因此我对这个问题也非常感兴趣。 两个简短的问题: 您是否尝试在datacontext中打开数据对象的缓存? 您是否尝试在循环过程中关闭datacontext并创建新的datacontext以释放内存

问候


Kenneth

我在使用EntityFramework方面没有太多经验(只是一些随机实验),您是否尝试过每n次迭代调用.SaveChanges()

我的意思是这样的:

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

我知道这很难看,但这是我提出的第一个可能的解决方案。

您正在实施哪些“更改”?为什么会有90000次储蓄?如果您只是在传递数据,也许应该尝试SQL复制?只是一个想法。只是澄清一下,当你说“每个循环一次”时,你的意思是每个循环迭代一次调用?在循环过程中创建一个新的上下文确实会释放内存,这会有所帮助,但会延长保存时间(通过处理更大的项目组,似乎有一些改进)。如何对数据对象进行一次缓存?这似乎是一个更好的解决方案(特别是平衡内存使用和速度)-它的性能似乎确实会随着n写入数的增加而提高(直到达到内存限制)。我仍然没有一个在所有情况下都有效的确定方法。