【问题标题】:Why does ASP.NET MVC WebAPI template use DbContext as a member variable?为什么 ASP.NET MVC WebAPI 模板使用 DbContext 作为成员变量?
【发布时间】:2015-02-19 23:30:17
【问题描述】:

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

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

它创建了一个控制器,将 DbContext 声明为成员变量,根据许多 stackoverflow 答案/在线文章,这是一个坏主意 - 就像这个

https://stackoverflow.com/a/10588594

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;
    }

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

那么,正确的方法是什么,如果是“使用” per request 方法,为什么 VS 模板使用成员变量方法?

【问题讨论】:

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


    【解决方案1】:

    原因是因为起点很简单

    使用 ASP.NET MVC 易于理解和上手。

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

    [ ... ] 根据许多 stackoverflow 答案/在线文章,这是一个坏主意

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

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

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

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

    解决您正在尝试做的事情的方法是

    // 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 的 per-web-request 生活方式。

    在这里展示一个完整的例子可能有点冗长,超出了问题的范围。

    【讨论】:

    • 很好的答案,已接受,谢谢。前任中的成员变量让我感到困扰的是,它就像在您离开操作方法的范围以实际获得结果之后使用它一样。此外,许多存储库/uow 示例只是使存储库/uow 类成为控制器的成员变量。我觉得存储库/uow 类也应该在每个操作方法的 using 语句中汇总......也许这是相同的区别。
    • 我想我同意你的看法。我刚刚创建了 Web API 服务,并且倾向于为每个方法创建 DbContext 实例......让我们监控工具显示这种方法是否存在任何问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    相关资源
    最近更新 更多