Owin 在初始化 Controller 之前处理 IdentityDbContext

Owin disposes IdentityDbContext before initializing Controller

我刚刚将我的项目迁移到 Owin,对其体系结构不是很熟悉。 在此之前,我有一个 dbContext,我已经在 Controller 构造函数中对其进行了初始化。 迁移到 Owin 后,我从 IdentityDbContext 继承了我的 dbcontext。

我从构造函数中删除了它的初始化并创建了一个控制器 属性(我希望在这里我可以从当前请求的生命周期内的 owin 存储库中检索上下文并继续在我的项目):

 public MyController()
{
 private static MyDataContext _myContext ;
    public MyDataContextMyContext
    {
        get
        {
            return _myContext ??
                   (_myContext = System.Web.HttpContext.Current.GetOwinContext().Get<MyDataContext>());
        }
    }}}

这里需要静态字段,我在MyDataContext中初始化它:

public class MyDataContext : IdentityDbContext
    {
    public static MyDataContext Create()
        {
            return new MyDataContext();
        } }

在 Startup.cs 我有这个:

 app.CreatePerOwinContext<MyDataContext>(MyDataContext.Create);
 app.CreatePerOwinContext<MyUserManager>(MyUserManager.Create);
 app.CreatePerOwinContext<MySignInManager>(MySignInManager.Create);

在我的基本控制器中我有这个构造函数:

    public MyController()
    {

        if (MyContext.Database.Exists())
        {/.../}

'If' 行抛出异常:

System.InvalidOperationException: The operation cannot be completed because the DbContext has been disposed.

当然,在 dbcontext 中覆盖 dispose 有帮助(仅用于测试),但显然这是错误的方法。

我的初始目标是在请求处于活动状态时为每个请求使用相同的上下文。我不想在控制器内创建一个新的数据库上下文(如果之前已经创建了一个,我为什么要这样做?)你能建议一个将 mvc5 身份验证与 EF 数据上下文一起使用的最佳实践吗?

只需删除 static 关键字...控制器 class 必须根据请求进行实例化,将上下文存储在静态变量中,在调用之间共享它。