Я создал пользовательский 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, но затем она теряет свои ленивые нагруженных свойства, и я должен помнить, чтобы попытаться прикрепить его снова к моему текущему хранилище/контексту.
Я также прочитал, что хорошо, что ваш пользовательский поставщик членства имеет тот же контекст, что и текущий запрос. Любые идеи о том, как достичь этого, как обеспечить, чтобы поставщик членства использовал тот же контекст, что и тот, который порожден, когда пользователь выполняет действие контроллера?