首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架从上下文中删除对象,但不从数据库中删除对象。

问实体框架从上下文中删除对象,但不从数据库中删除对象。
EN

Stack Overflow用户
提问于 2012-06-29 00:19:09
回答 2查看 17.5K关注 0票数 9

我正在处理一个批处理过程,它将慢速遗留数据库中的80万条记录(每次记录提取time...it加起来1.4-2ms)中的~80万条记录转储到MySQL中,这样可以执行得更快一些。为了优化这一点,我一直在将所有的MySQL记录加载到内存中,这使使用量达到了大约200 To。然后,我开始从遗留数据库中转储并更新记录。

最初,当它完成更新记录时,我将调用SaveContext,这将使我的内存从大约500 my 800 my跃升到1.5GB。很快,我就会摆脱内存异常(正在运行的虚拟机有2GB的RAM),即使我给它提供更多的RAM,1.5-2GB的内存仍然有点过高,这只是为问题提供了一个创可贴。为了弥补这一点,我开始每10,000条记录调用一次,这对一些事情都有帮助,而且由于我使用委托从遗留数据库中获取数据并在MySQL中更新它,所以性能没有受到太大的影响,因为在保存5秒左右之后,它将在内存中运行更新,以保存备份的大约3000条记录。然而,内存的使用仍然在不断上升。

以下是我的潜在问题:

  • 数据以任何顺序从遗留数据库中提取出来,因此我不能对更新进行分块,并定期发布ObjectContext。
  • 如果我不事先从MySQL中抓取所有的数据,而是在更新过程中通过记录查找数据,它会非常慢。相反,我事先抓取了所有的内容,将其转换到由主键索引的字典中,并在更新数据时从字典中删除记录。

我想出的一个可能的解决方案是以某种方式释放实体使用的内存,因为它们已经被更新(比如清除缓存,但只用于特定项),但我不知道实体框架是否可能使用这些内存。

有人有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-29 01:15:04

您可以在上下文中调用Detach方法,将不再需要的对象传递给它:http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.detach%28v=vs.90%29.aspx

票数 6
EN

Stack Overflow用户

发布于 2012-06-29 02:08:55

我想知道您的最佳选择不是以前建议的另一个工具,还是干脆放弃使用实体框架。如果您不使用ORM来执行代码,则可以:

  1. 优化SQL语句以提高性能
  2. 容易控制和更改事务的范围,以获得最佳的性能。
  3. 您可以对更新进行批量处理,这样就不会调用服务器来完成多个更新,而不是一次执行一个更新。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11254642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档