在ADO.Net Data Services中使用.SaveChanges()方法的最佳方法是什么?

时间:2008-10-10 03:49:53

标签: entity-framework wcf-data-services savechanges

有没有人对.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 not found error
  • 每10个循环调用一次.SaveChanges(SaveChangesOption.Batch)
    • 400错误请求错误(偶尔)
    • 经过多次尝试后的OutOfMemory
  • 许多随机尝试每个循环创建一次上下文,或者在循环开始时将其作为变量或将其作为可用的私有成员变量。
    • 不同的结果,无法量化,没有真正那么好

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

2 个答案:

答案 0 :(得分: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();

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

答案 1 :(得分:0)

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

此致