2008-10-10 110 views
8

有没有人对使用.SaveChanges()方法有一些很好的信息?在ADO.Net数据服务中使用.SaveChanges()方法的最佳方法是什么?

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

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

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

什么是做这样一个大的数据负载时,从客户端访问对象.SaveChanges()的首选方法是什么?有没有什么我没有得到如何.SaveChanges()的作品?任何人都可以提供关于一次应该如何使用该功能的更多细节,以及通过数据服务保存数据的限制(如果有的话)是什么?有没有关于.SaveChanges()方法调用的最佳实践? .SaveChanges()方法调用有特别好的文档吗?

+0

你正在实施什么“变化”?为什么90,000节省?也许你应该尝试SQL复制,如果你只是传递数据?只是一个想法。 – D3vtr0n 2008-11-28 05:16:53

+0

只是为了澄清,当你说“每循环一次”,你的意思是每个循环*迭代*一次调用? – Veverke 2015-10-12 12:22:04

回答

3

我在使用的EntityFramework(只是一些随机试验)没有大的经验,你有没有打过电话.SaveChanges()每n次迭代?

我的意思是这样的:

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

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

0

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

问候

肯尼斯

+0

在循环过程中创建一个新的上下文会释放内存,但这会使得保存时间变长(处理更大的项目组似乎有所改进)。数据对象的缓存怎么转一圈? – ChrisHDog 2008-12-02 05:22:10

相关问题