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

标签 asp.net-mvc entity-framework asp.net-web-api

如果您在 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/

相关文章:

c# - 通过 WPF MVVM 中不断刷新的存储库持久化 EF 更改

c# - Entity Framework 中的 Linq 查询错误

c# - 在验证文本框/复选框之前,文本框/复选框的数据绑定(bind)值不正确

jquery - Angularjs + ASP.NET MVC + ASP.NET Web API

asp.net-mvc - MVC1 和 MVC2 之间的区别

c# - 如何从 MVC Controller 中提取错误处理代码?

c# - 我可以手动硬编码 JSON 对象以由 ASP.NET Web API 返回吗?

asp.net - 为什么 Web API 请求的主体会被读取一次?

c# - 指定的包含路径无效。 EntityType '*Propiedad' 未声明名称为 'Nombre' 的导航属性

asp.net-mvc - 什么是 ASP.NET MVC 中的模型绑定(bind)?