为什么ASP.NET MVC WebAPI模板使用DbContext作为成员变量?

Why does ASP.NET MVC WebAPI template use DbContext as a member variable?

如果您在 Visual Studio 2013 年创建一个 WebAPI/MVC 项目,请添加模型(和 DbContext class),以及此处概述的此模型的控制器 -

http://www.asp.net/web-api/overview/data/using-web-api-with-entity-framework/part-2,

它创建了一个将 DbContext 声明为成员变量的控制器,根据许多 Whosebug answers/online 文章,这是一个坏主意 - 就像这个

Visual Studio-

生成的控制器方法
// GET: api/Authors
public IQueryable<Author> GetAuthors()
{
    return db.Authors;
}

如果您使用建议的每个请求生命周期,将无法工作 -

// GET: api/Authors
    public IQueryable<Author> GetAuthors()
    {
        DbSet<Author> authors = null;
        using(MyContext db = new MyContext) {
             authors = db.Authors;
        }
        return authors;
    }

因为在迭代结果时上下文超出范围并且您得到一个对象处置异常。

那么,正确的方法是"using" per request方法,为什么VS模板要使用成员变量方法?

原因是因为这是一个简单的起点

ASP.NETMVC 易于理解和上手。

DbContext 作为在控制器级别创建的成员变量并没有什么错,尽管它可能并不理想。随着应用程序变得越来越复杂,它就不太适合了。

[ ... ] according to many Whosebug answers/online arcticles, is a bad idea

我根本没有从你链接的答案中得到这一点。

Steven 解释说 单个 DbContext(即全局)或每个线程 上下文 是不好的。

Will not work if you use the recommended per request lifetime

这不是每个请求的生命周期。这几乎就像一个工作单元模式,但您没有用它做任何事情。

您要执行的操作的修复方法是

// GET: api/Authors
public IEnumerable<Author> GetAuthors()
{
    IEnumerable<Author> authors = null;

    using(MyContext db = new MyContext())
    {
         authors = db.Authors.ToList();
    }

    return authors;
}

在我看来,处理此问题的正确方法是为具有 IoC Container.

的 DbContext 使用每个 Web 请求的生活方式

在此处显示完整示例可能有点冗长,超出了问题的范围。