【问题标题】:Handling Entity-Framework Context处理实体框架上下文
【发布时间】:2014-08-07 11:15:15
【问题描述】:

在新的MVC-5 模板中,App_Start 文件夹中有一个名为Startup.Auth.cs 的文件,其中包含以下行(以及一些其他数据):

// Configure the db context and user manager to use a single instance per request
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);

a single instance per request 是什么意思?以及像这样调用ApplicationDbContext 有什么区别:

var context = HttpContext.GetOwinContext().Get<ApplicationDbContext>();

并将此声明作为字段放在Controller class

public class HomeController : Controller
{
    private ApplicationDbContext context = new ApplicationDbContext();

是否有处理context 的首选方法?是singleton class 提供context 首选?

【问题讨论】:

    标签: c# entity-framework ef-code-first asp.net-mvc-5


    【解决方案1】:

    这只是一种在调用您的某个操作方法时创建上下文对象的便捷方式。您希望每个请求有一个实例,因为您希望所有对象都附加到同一个上下文实例。您还希望上下文的生命周期成为请求生命周期。

    如果您要使用第二种方法private ApplicationDbContext context = new ApplicationDbContext();,则必须将其放入每个控制器中。你可以创建某种基本控制器来做同样的事情,并且只是从你的基本控制器继承。

    同样,它只是一种用于演示的便捷方法。

    【讨论】:

    • 那么将private ApplicationDbContext context = new ApplicationDbContext(); 放在控制器级别会在每个请求上创建一个实例吗?服务器响应后会释放该实例吗?
    • 不,您应该在控制器上编写一个 dispose 方法来处理上下文。这是其他技术的另一个方便之处。
    • 在从操作返回之前我是否必须手动处理上下文?
    • 控制器已经实现了 IDisposable。您需要做的就是用您自己的实现覆盖它并调用基本方法。
    • 所以通过创建一个这样的上下文实例:var context = HttpContext.GetOwinContext().Get&lt;ApplicationDbContext&gt;(); 我不需要显式处理它?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    相关资源
    最近更新 更多