8

有人对 .SaveChanges() 方法的使用有一些好的信息吗?

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

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

  • 在 foreach 循环结束时(即循环外)调用一次不带任何参数的 .SaveChanges()
    • OutOfMemory 错误大约 1/3 的方式(90,000 次保存中的 30,000 次) - 不确定这是如何发生的,尽管每个保存项都是对数据库的单独 SQL 调用,内存不足是什么?
  • 每个循环调用一次不带任何参数的 .SaveChanges()
    • 这有效,但绝对需要永远(90,000 次保存需要 8 小时)
  • 在 foreach 循环结束时调用 .SaveChanges(SaveChangesOption.Batch) 一次
    • 同样的 OutOfMemory 错误,但没有任何保存到数据库
  • 每个循环调用一次 .SaveChanges(SaveChangesOption.Batch)
    • 404 未找到错误
  • 每 10 个循环调用一次 .SaveChanges(SaveChangesOption.Batch)
    • 400 Bad Request 错误(偶尔)
    • 多次迭代后 OutOfMemory
  • 每次循环创建上下文一次的随机尝试次数,或者将其作为循环开始时的变量,或者将其作为可用的私有成员变量。
    • 不同的结果,无法量化,没有一个真的那么好

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

4

2 回答 2

4

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

我的意思是这样的:

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

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

于 2008-12-11T15:09:01.740 回答
0

我也在一个小项目上使用 EntityFramework,所以我对这个问题也很感兴趣。两个快速的问题:您是否尝试过关闭数据上下文中的数据对象的缓存?您是否尝试关闭数据上下文并在循环期间创建一个新的以释放内存?

问候

肯尼斯

于 2008-11-04T14:10:46.263 回答