我正在尝试从当前的 Owin 上下文中获取 DbContext,因此我可以在我的应用程序上使用单个上下文,但是,我收到了 NullReferenceException。
我可以访问 UserManager 和 RoleManager:
private ApplicationUserManager _userManager;
public ApplicationUserManager UserManager
{
get
{
return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
private set
{
_userManager = value;
}
}
它们是在 Identity 示例项目中默认配置的:
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);
app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);
但是尝试获取上下文以直接使用它:
ApplicationDbContext context = HttpContext.GetOwinContext().Get<ApplicationDbContext>();
它总是在我的 Controller 上返回 null。如何从 Owin 上下文中获取当前的 DbContext?
编辑:
我正在创建一个新的上下文以与我的通用存储库一起使用
public AdminController()
{
AppContext = new ApplicationDbContext();
this.repoProyects = new GenericRepository<Proyect>(AppContext);
}
但是它在从多个上下文中引用实体时产生了一个问题,所以我试图像这样获取当前的 Owin 上下文:
public AdminController()
{
this.AppContext = HttpContext.GetOwinContext().Get<ApplicationDbContext>();
this.repoProyects = new GenericRepository<Proyect>(AppContext);
}
HttpContext 从这里开始始终为空,所以我不知道如何获取上下文以将其传递给我的类。
最佳答案
当我向 ApplicationUser 添加一些额外的导航属性时,我在使用 Identity Framework 时遇到了同样的问题。如果你设置
appContext = HttpContext.Current.GetOwinContext().Get<ApplicationDbContext>();
在 OnActionExecuting 而不是在构造函数中,那么 OWIN 应该准备好返回此时正在使用的 DbContext。 OnActionExecuting 在任何操作方法触发之前启动,因此这应该足够早以供使用。希望有帮助。
关于asp.net-mvc - 如何在 ASP.Net Identity 上获取 OWIN 上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26695113/