实体框架将数据保存在内存中,即使它已被丢弃

时间:2013-02-17 13:09:42

标签: vb.net entity-framework memory using

我现在正在玩EF,因为我想在一个新项目中使用它,但我遇到了一些我无法向自己解释的记忆问题。

情况如下:

我打开一个包含显示数据的网格的新表单。在OnLoad事件中,我使用实体框架模型从数据库获取数据:

   Using db As New OfficeDatabaseModelContainer(DatabaseManager.Instance.ProductiveConnectionString)
        Dim groupList As List(Of String) = New List(Of String)
        groupList.Add("Active")
        GridUtils.AssignObjectListToGrid(grdUser, db.User, GetType(User), groupList)
   End Using

此代码为内存增加了大约10MB(由于测试我从数据库中读取了15k行)。 当我关闭表单时,我以编程方式处理表单以及包含数据的网格。但是数据库模型的10MB上下文仍保留在内存中。即使它应该在我使用块中获取数据时进行处理。

如果我打开表单10次,它总是将新数据量添加到内存中(这是有道理的)但不清除已处理的数据。

我甚至试图在关闭表单时调用GC.Collect(),但它也没有帮助。

内存泄漏不是来自网格或其他东西。我使用以下代码证明了这一点:

Dim userList = DatabaseManager.Instance.ProductiveDatabase.User
Dim groupList As List(Of String) = New List(Of String)
groupList.Add("Active")
GridUtils.AssignObjectListToGrid(grdUser, userList, GetType(User), groupList)

这样我在单例类中有一个数据库模型的静态属性。其中ProductiveDatabase是模型的实例,而User表示用户表。我可以经常调用表单,因为我希望内存使用量保持在~10MB,这非常有意义,因为我总是以这种方式对相同的对象使用相同的引用。

我必须做错事。我在互联网上搜索了模型的用法并尽可能降低内存使用率。这里的最佳做法似乎是在使用模型时使用using块。

2 个答案:

答案 0 :(得分:0)

在您的代码中完成后,我会处理该列表 实际上处理任何IDisposable的对象

groupList.dispose

答案 1 :(得分:0)

对dbcontext的第一次调用将构建所有配置等,并将其静态存储在进程内存中。要确认这一点,请尝试添加第二次和第三次调用,内存占用应保持一致。