2014-11-02 45 views
4

我想從當前的Owin上下文中獲取DbContext,所以我可以在我的應用程序中使用單個上下文,但是,我收到了NullReferenceException。如何獲得ASP.Net標識的OWIN上下文?

我可以訪問的UserManager和RoleManager:

private ApplicationUserManager _userManager; 
    public ApplicationUserManager UserManager 
    { 
     get 
     { 
      return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); 
     } 
     private set 
     { 
      _userManager = value; 
     } 
    } 

他們配置是怎麼產生的默認的身份樣本項目:

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>(); 

它總是在我的控制器上返回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從這裏始終爲空,所以我不知道如何g並將上下文傳遞給我的課程。

+0

在應用程序上下文的構造函數中放置一個斷點,其思想是確保上下文在第一次解析後不會處理。這可能會導致上下文在第二次嘗試解析時爲空。 – 2014-11-02 01:46:58

+0

您是自己創建控制器還是讓框架處理控制器創建?如果控制器中的「HttpContext」爲空,那麼MVC流水線就會出現問題。 – trailmax 2014-11-02 21:17:38

+0

框架正在處理控制器創建,我不明白爲什麼,但我認爲HttpPContext沒有準備好在控制器的構造函數內使用 – 2014-11-02 21:34:18

回答

0

當我向ApplicationUser添加一些額外的導航屬性時,使用Identity Framework時我遇到了同樣的問題。如果您在OnActionExecuting而不是在構造函數中設置

appContext = HttpContext.GetOwinContext().Get<ApplicationDbContext>(); 

,然後OWIN應該準備返回的在這一點上使用的DbContext。 OnActionExecuting在任何動作方法觸發之前開始,所以這應該足夠早以便有用。希望有所幫助。

+0

僅供參考:如果您使用Microsoft.AspNet.Identity添加: .Owin; – Guillaume 2015-12-29 05:49:32

0

一下添加到Startup.cs

app.CreatePerOwinContext(DbContext.Create);