为什么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 请求的生活方式
在此处显示完整示例可能有点冗长,超出了问题的范围。
如果您在 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 请求的生活方式在此处显示完整示例可能有点冗长,超出了问题的范围。