如果您在 Visual Studio 2013 中创建 WebAPI/MVC 项目,请添加模型(和 DbContext 类)以及该模型的 Controller ,如下所述 -
http://www.asp.net/web-api/overview/data/using-web-api-with-entity-framework/part-2 ,
它创建一个 Controller ,将 DbContext 声明为成员变量,根据许多 stackoverflow 答案/在线文章,这是一个坏主意 - 就像这个
https://stackoverflow.com/a/10588594
Visual Studio 生成的 Controller 方法-
// 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.NET MVC 易于理解且易于上手。
将 DbContext
作为在 Controller 级别创建的成员变量并没有什么问题,尽管它可能并不理想。随着应用程序变得越来越复杂,它就不太适合了。
[ ... ] according to many stackoverflow 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;
}
在我看来,处理这个问题的正确方法是对 DbContext 使用每个网络请求的生活方式,并带有 IoC Container .
此处显示完整的示例可能有点冗长并且超出了问题的范围。
关于asp.net-mvc - 为什么 ASP.NET MVC WebAPI 模板使用 DbContext 作为成员变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28619050/