首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在EF 4中清除/重置ObjectContext

如何在EF 4中清除/重置ObjectContext
EN

Stack Overflow用户
提问于 2011-03-27 19:33:30
回答 2查看 5.9K关注 0票数 0

我有一个包含数百万条记录的分层结构。我正在对数据库进行递归扫描,以便更新一些连接和一些数据。问题是我得到了一个外存异常,因为整个DB最终被加载到上下文中(惰性)。我不再需要的数据保留在上下文中,没有任何方法将其删除。我也不能使用Using(上下文...)因为我需要活动的上下文,因为我正在进行递归扫描。

请把递归当作事实。谢谢

EN

回答 2

Stack Overflow用户

发布于 2011-03-27 19:42:16

这种类型的操作处理得并不好,使用实体也不能很好地扩展。对于批处理操作,我倾向于使用存储过程。

如果你确实想从上下文中删除/转储对象,我相信this post有一些信息(在底部可以解决你的问题)。

票数 2
EN

Stack Overflow用户

发布于 2011-05-01 18:46:40

只是遇到了同样的问题。在我使用EF作为对象关系映射工具之前,我使用过NHibernate,它也有完全相同的问题。只要上下文是活动的,这些框架就会将对象保留在内存中,这有两个后果:

  • 严重性能减慢:框架在内存中的对象之间进行比较(例如,查看对象是否存在)。您将注意到,在处理许多记录时,性能会逐渐下降,因为您最终会耗尽内存。

如果可能,我总是尝试使用纯SQL在数据库上执行大型批处理操作(正如上面的文章清楚地说明的那样),但在这种情况下,这不是一种选择。因此,为了解决这个问题,NHibernate在会话上有一个“清除”方法,它丢弃内存中引用数据库记录的所有对象(新的、添加的、损坏的……)。我尝试在实体框架中模仿这个方法,如下所示(使用上面描述的帖子):

代码语言:javascript
复制
    public partial class MyEntities
    {

        public IEnumerable<ObjectStateEntry> GetAllObjectStateEntries()
        {
            return ObjectStateManager.GetObjectStateEntries(EntityState.Added |
                                                        EntityState.Deleted |
                                                        EntityState.Modified |
                                                        EntityState.Unchanged);
        }

        public void ClearEntities()
        {
            foreach (var objectStateEntry in GetAllObjectStateEntries())
            {
                Detach(objectStateEntry.Entity);
            }
        }
    }

GetAllObjectStateEntries()方法是单独使用的,因为它对其他事情很有用。这将放入一个与Entities类同名的分部类(即EF生成的类,本例中为MyEntities ),因此它在entities实例上可用。

我现在每处理1000条记录就调用这个clear方法,我的应用程序过去运行大约70分钟(只有大约40万个实体要处理,甚至不是数百万个),现在只需要25分钟。内存曾经达到300MB的峰值,现在保持在50MB左右

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5448950

复制
相关文章

相似问题

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