.NET Core Identity с использованием userManager и загрузки дополнительных свойств ApplicationUser - PullRequest
0 голосов
/ 06 июня 2018

Мой вопрос основан на теме здесь , но, поскольку я не могу добавлять комментарии, я думаю, что мне нужно открыть новую тему.

В моем бэкэнде ASP.NET CoreЯ использую ASP.NET Core Identity для управления пользователями.Он предоставляет методы для аутентификации пользователей с помощью так называемого менеджера пользователей.

Теперь у меня проблемы с использованием методов из менеджера пользователей, с одной стороны, и загрузкой пользовательских свойств приложения пользователя, с другой стороны.

Сценарий выглядит следующим образом: интерфейс отправляет через контроллер MVC (HTTP-запрос) логин dto, который содержит адрес электронной почты и пароль.Теперь я хочу загрузить пользователя приложения методом FindByEmailAsync, предоставленным менеджером пользователей.Я обертываю этот метод в самодельный пользовательский репозиторий приложений, где менеджер пользователей внедряется путем внедрения зависимостей, и который также имеет доступ к контексту приложения.Поскольку диспетчер пользователей не загружает пользовательские свойства при загрузке диспетчера пользователей, я также должен выполнить некоторые дополнительные действия для загрузки этих свойств.

Сначала я попытался полностью загрузить пользователя через контекст (а не через диспетчера пользователей).).Это работало нормально, и дополнительные свойства также могли быть загружены.Проблемы начались, когда впоследствии пытались использовать метод usermanager.CheckPasswordAsync.Я получил исключение:

"экземпляр объекта ApplicationUser не может быть отслежен, поскольку другой экземпляр с таким же значением ключа для id уже отслежен".

Я думаю,это стало результатом использования контекста для загрузки пользователя, с одной стороны, и менеджера пользователей для выполнения checkPassword.Затем я попытался загрузить пользователя с FindByEmailAsync из usermanager.Все работало нормально, без исключений, но пользовательские свойства не были загружены.В теме, которую я связал выше, есть некоторые предложения, но ни одно из них не работает для меня.

  1. Предложение:

    var user = await userManager.Users
      .Include(x => x.Address)
      .SingleAsync(x => x.NormalizedEmail == email);
    

userManager.Users является IQueryable<Users> и не содержит метод Include.

Предложение:

await context.Entry(user).Reference(x => x.Address).LoadAsync();

В моем случае пользовательское свойство (Certificates) является коллекцией, поэтому я использовал .Collection вместо .Reference, но получилследующая ошибка:

«Невозможно загрузить свойство навигации« Сертификаты »для объекта типа« ApplicationUser », поскольку объект не отслеживается. Свойства навигации могут быть загружены только для отслеживаемых объектов."

У кого-нибудь есть предложения, как использовать предоставленные методы менеджера пользователей и в том числе настраивать свойства для пользователя приложения?

Спасибо!

1 Ответ

0 голосов
/ 07 марта 2019

Я столкнулся с той же проблемой и заметил, что она работает, когда вы загружаете свой DbContext перед доступом к пользовательскому свойству

var user = await userManager.Users;
_context.Users.Include(u => u.Address).FirstOrDefault(x => x.NormalizedEmail == email);

var adress = user.Address;
...