2012-05-22 3 views
0

Я создал пользовательский MemberhipProvider в веб-приложении MVC. Функция GetUser возвращает экземпляр моего собственного класса Employee, который наследуется от стандартного MemberhipUser. Это позволяет мне предоставлять дополнительную информацию для каждого пользователя, например, различные сведения о сотрудниках.ASP.NET custom MembershipProvider и общие DbContexts

public override MembershipUser GetUser(string username, bool userIsOnline) 
    { 
     return new ModelRepository().GetModels<Employee>().Where(e => e.UserName == username).FirstOrDefault(); 
    }   

Проблема у меня, поставщик членства порождает новый экземпляр моего репозитория класса (который создает новый DbContext) для получения объекта Employee. Этот объект Employee затем передается любому запросу/контроллеру, называемому членством api.

Employee currentUser = (Employee)Membership.GetUser(); 

, что вызов запрос часто требуется создать новый объект в памяти, позволяет сказать, что новый SicknessRecord и назначить пользователь найденную ранее эту запись, а затем сохранить его в БД с собственного хранилища модели. Вероятно, вы можете увидеть, где это происходит, структура жалуется, что я пытаюсь сохранить объект (пользователь) с контекстом, из которого он первоначально не был извлечен.

Мое настоящее, довольно хакерское решение состоит в том, чтобы просто использовать идентификатор пользователя, извлеченного из Membership.GetUser, и переходить и повторно извлекать объект Employee из моего текущего репозитория модели.

newSickness.Employee = this.modelRepository.GetModelById<Employee>(this.me.Id.Value); 

Я попытался отсоединение объекта Employee, но затем она теряет свои ленивые нагруженных свойства, и я должен помнить, чтобы попытаться прикрепить его снова к моему текущему хранилище/контексту.

Я также прочитал, что хорошо, что ваш пользовательский поставщик членства имеет тот же контекст, что и текущий запрос. Любые идеи о том, как достичь этого, как обеспечить, чтобы поставщик членства использовал тот же контекст, что и тот, который порожден, когда пользователь выполняет действие контроллера?

ответ

0

Для каждого контроллера может быть один отдельный экземпляр DbContext.

public class SomeController : Controller 
{ 
    private DbContext context = new DbContext(); 
    private CustomMembershipProvider membershipProvider = new CutomMembershipProvider(this.context); 

    ... Actions .... 
} 

Насколько я знаю, один контекст для каждого контроллера - хорошая практика.

Кстати, если у вас есть несколько репозиториев, попробуйте использовать UnitOfWork с шаблоном репозитория.

Смежные вопросы