何时需要处理数据库连接的释放?

3

我有一个包含多个自定义方法的类,用于在我的MVC应用程序中使用,并在多个地方使用。以下是其中一些示例:

    private MyEntities db = new MyEntities();


    public List<SelectListItem> GetLocationList()
    {
        var query =
                db.v_LocationsAlphabetical.OrderByDescending(x => x.Category).ThenBy(x => x.LocationName).ToList()
                .Select(x => new SelectListItem
                {
                    Value = x.LocationID.ToString(),
                    Text = x.LocationName
                });

        return (query).ToList();
    }

    public IEnumerable<SelectListItem> GetStates()
    {
        var query = db.States.Select(x => new SelectListItem
        {
            Value = x.Abbr,
            Text = x.Name
        });

        return(query);
    }

    public List<Person> GetPeople()
    {
        var query = db.Person.OrderBy(m => m.LastName).ThenBy(m => m.FirstName).ToList();

        return (query);

    }

这些方法中的每一个都会调用数据库来获取数据,我想知道是否需要在每个方法中添加dispose。如果不需要,为什么?谢谢。


2
完全没有关系,但是你为什么总是在括号中返回查询呢? - NunoCarmo
3个回答

6

不应在每个方法中调用dispose,因为db的生命周期与所包含的类相同,因为它不是方法中的局部变量。

典型的处理方式是使当前类实现IDisposable接口,并在Dispose()方法中调用db.Dispose()


2
这通常是不正确的。在 DbContext 上调用 Dispose 通常是不必要的,因为没有需要处理的内容。这直接来自编写 DbConext 类的 EF 团队。有关详细说明,请访问 http://blog.jongallant.com/2012/10/do-i-have-to-call-dispose-on-dbcontext.html#.Ua0IS5yXT0U 。 - Robert McKee
@RobertMcKee:当一个类不应该被处理时,将其标记为“IDisposable”似乎是一个有趣的选择。 - recursive
只有在手动操作连接时才需要这样做。否则就没有需要处理的内容了。由于大多数人不会手动打开和关闭连接,因此处理是可选的。 - Robert McKee
有趣的博客文章。我从未知道过。 - recursive
感谢大家的回答。有一件事我应该指出,我相当确定我没有使用dbContext对象,而是使用了ObjectContext(我对这些还很陌生)。我正在使用Db First,所以我从现有的数据库创建了一个edmx文件,然后用以下代码创建了一个实例:private MyEntities db = new MyEntities();。这会影响你们的回答吗? - BattlFrog

0

不需要手动处理 DbContext,除非您手动管理连接。因此,通常情况下,处理它们是可选的。


3
垃圾收集是基于作用域可访问性自动发生的,但处理不会。 - recursive
EF团队(编写DbContext类的人)的回应,解释了为什么在几乎所有情况下,DbContext不需要手动处理:http://blog.jongallant.com/2012/10/do-i-have-to-call-dispose-on-dbcontext.html#.Ua0IS5yXT0U - Robert McKee
你编辑了你的回答。之前是不正确的。我给了你一个赞。 - recursive
答案是正确的,但技术上的原因是错误的。我已经编辑过了,现在它是正确的,并提到了在某些不寻常情况下需要手动处理DbContext的情况。 - Robert McKee

0

在.NET中,处理数据库连接有多种方法。
我最喜欢的之一是称为“每个请求一个dbcontext”的方法,这基本上意味着您在需要时初始化dbcontext,在不考虑实例化或处理的情况下完成工作,并在请求完成时自动处理。 (有点像UnitOfWork)

我已经在这里展示了这种方法。它不仅适用于EF,还适用于Linq2SQL,ADO.NET等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接