4

我发现自己经常这样做:

using(var db = new MyDbContext())
{
  return db.Users.ToList(); // or some other simple query
}

这些简单的情况会很好,例如:

return MyDbContext.Execute(db => db.Users);

但我不确定我会如何做扩展方法。理想情况下(我认为)它需要一个 DbContext(所以我可以重用代码)并返回模板化的 IList.. 但这可能吗?

当然,如果已经有一种方法可以做到这一点,我很乐意听到它..

4

3 回答 3

5

您可以为此编写最简单的静态类。您不需要扩展方法,因为这需要一个实例(并且根据您示例中的语法,您还没有):

public static class MyDbContextStatic { 
    public static T Execute(Func<MyDbContext, T> f) {
        using (var db = new MyDbContext())
            return f(db);
    }
}

要使用:

var users = MyDbContextStatic.Execute(db => db.Users);

IIRC,您可能还想在处理 DbContext 之前在每个对象上调用 Detach 或其他东西。但你明白了。

于 2012-08-28T04:55:59.923 回答
2

您的第一个示例是正确的方法,它确保Dispose在块结束后调用,这将导致连接关闭。您可能会想出一个扩展方法来完成您的工作,但这需要您DbContext在内存中引用 static DbContext

关于数据库连接,你应该尽可能晚地打开它们并尽可能早地关闭它们。

于 2012-08-28T04:52:27.763 回答
0

DbContext 为您管理底层连接。
您可以调用 Dispose,但在大多数常见情况下,您不需要这样做。

http://blog.jongallant.com/2012/10/do-i-have-to-call-dispose-on-dbcontext.html

于 2016-01-28T08:32:28.853 回答