Как получить контекст OWIN в ASP.Net Identity?

Я пытаюсь получить DbContext из текущего контекста Owin, поэтому я могу использовать один контекст в своем приложении, однако я получаю исключение 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>();

Он всегда возвращает ноль на моем контроллере. Как я могу получить текущий DbContext из контекста Owin?

ИЗМЕНИТЬ:

Я создавал новый контекст для использования с моим общим репозиторием.

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 всегда равен нулю, поэтому я не знаю, как получить контекст, чтобы передать его моему классу.


person Carlos Martinez    schedule 02.11.2014    source источник
comment
Поместите точку останова в конструкторе контекста приложения, идея состоит в том, чтобы убедиться, что контекст не удаляется после первого разрешения. Это может привести к тому, что контекст будет нулевым во второй раз, когда вы попытаетесь его разрешить.   -  person Omar.Alani    schedule 02.11.2014
comment
Вы сами создаете контроллер или позволяете фреймворку обрабатывать создание контроллера? Если HttpContext внутри контроллера равно null, значит, что-то не так с конвейером MVC.   -  person trailmax    schedule 03.11.2014
comment
фреймворк обрабатывает создание контроллера, я не понимаю почему, но я думаю, что HttPContext не готов к использованию в конструкторе контроллера   -  person Carlos Martinez    schedule 03.11.2014


Ответы (2)


У меня была такая же проблема с использованием Identity Framework, когда я добавил некоторые дополнительные свойства навигации в ApplicationUser. Если вы установите

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

в OnActionExecuting, а не в конструкторе, тогда OWIN должен быть готов вернуть DbContext, который используется в этот момент. OnActionExecuting срабатывает до того, как сработают какие-либо методы действия, поэтому это должно быть достаточно рано, чтобы быть полезным. Надеюсь, это поможет.

person diego    schedule 26.05.2015
comment
Просто для информации: это будет работать, только если вы добавите: using Microsoft.AspNet.Identity.Owin; - person Guillaume; 29.12.2015

Мне не хватало инициализации моих сущностей в методе Startup ConfigureOauth...

app.CreatePerOwinContext<OwinAuthDbContext>(() => new OwinAuthDbContext());  

Нашел ответ здесь: http://www.c-sharpcorner.com/UploadFile/ff2f08/token-based-authentication-using-Asp-Net-web-api-owin-and-i/

person Jenn    schedule 21.04.2016