Мой вопрос основан на теме здесь , но, поскольку я не могу добавлять комментарии, я думаю, что мне нужно открыть новую тему.
В моем бэкэнде ASP.NET CoreЯ использую ASP.NET Core Identity для управления пользователями.Он предоставляет методы для аутентификации пользователей с помощью так называемого менеджера пользователей.
Теперь у меня проблемы с использованием методов из менеджера пользователей, с одной стороны, и загрузкой пользовательских свойств приложения пользователя, с другой стороны.
Сценарий выглядит следующим образом: интерфейс отправляет через контроллер MVC (HTTP-запрос) логин dto, который содержит адрес электронной почты и пароль.Теперь я хочу загрузить пользователя приложения методом FindByEmailAsync
, предоставленным менеджером пользователей.Я обертываю этот метод в самодельный пользовательский репозиторий приложений, где менеджер пользователей внедряется путем внедрения зависимостей, и который также имеет доступ к контексту приложения.Поскольку диспетчер пользователей не загружает пользовательские свойства при загрузке диспетчера пользователей, я также должен выполнить некоторые дополнительные действия для загрузки этих свойств.
Сначала я попытался полностью загрузить пользователя через контекст (а не через диспетчера пользователей).).Это работало нормально, и дополнительные свойства также могли быть загружены.Проблемы начались, когда впоследствии пытались использовать метод usermanager.CheckPasswordAsync
.Я получил исключение:
"экземпляр объекта ApplicationUser не может быть отслежен, поскольку другой экземпляр с таким же значением ключа для id уже отслежен".
Я думаю,это стало результатом использования контекста для загрузки пользователя, с одной стороны, и менеджера пользователей для выполнения checkPassword
.Затем я попытался загрузить пользователя с FindByEmailAsync
из usermanager
.Все работало нормально, без исключений, но пользовательские свойства не были загружены.В теме, которую я связал выше, есть некоторые предложения, но ни одно из них не работает для меня.
Предложение:
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 », поскольку объект не отслеживается. Свойства навигации могут быть загружены только для отслеживаемых объектов."
У кого-нибудь есть предложения, как использовать предоставленные методы менеджера пользователей и в том числе настраивать свойства для пользователя приложения?
Спасибо!