我刚刚将我的项目迁移到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身份验证的最佳实践?
答案 0 :(得分:1)
只需删除static关键字......必须根据请求对控制器类进行异步化,将上下文存储在静态变量中,在调用之间共享它。