Owin在初始化Controller之前处理IdentityDbContext

时间:2015-12-02 08:21:01

标签: c# entity-framework asp.net-mvc-5 owin

我刚刚将我的项目迁移到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())
        {/.../}

'如果'行引发异常:

  

System.InvalidOperationException:无法完成操作   因为已经处理了DbContext。

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

我的最初目标是在请求生效时为每个请求使用相同的上下文。我不想在控制器内部创建一个新的db上下文(为什么我之前已经创建了一个?)你能否建议在EF datacontext中使用mvc5身份验证的最佳实践?

1 个答案:

答案 0 :(得分:1)

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