Owin在初始化Controller之前处理IdentityDbContext

本文关键字:前处理 IdentityDbContext Controller 初始化 Owin | 更新日期: 2023-09-27 18:25:15

我刚刚将我的项目迁移到Owin,对它的架构不太熟悉。在此之前,我有一个dbContext,我已经在Controller构造函数中初始化了它。迁移到Owin后,我继承了我的数据库上下文。我已经从IdentityDbContext继承了数据库上下文。

我从构造函数中删除了它的初始化,并创建了一个控制器属性(我希望我可以在当前请求的生命周期内从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:操作无法完成因为DbContext已被释放。

当然,在dbcontext中重写dispose有帮助(只是为了测试),但显然这是错误的方法。

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

Owin在初始化Controller之前处理IdentityDbContext

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