Попытка создать данные ASP.Net Core Identity в существующей таблице с существующими пользовательскими записями - PullRequest
0 голосов
/ 27 августа 2018

У меня есть новый веб-сайт ASP.Net Core, который использует существующую базу данных, к которой я добавил ASP.Net Core Identity для управления пользователями.

Поскольку существует пользовательская таблица, я просто добавил ту, в которую правильно добавил столбцы идентификаторов ASP.Net.

Дополнительные столбцы в существующей таблице находятся в моем производном от IdentityUser классе.Логика сайта работает хорошо при создании новых пользователей, а также при входе, выходе из системы и т. П.

Проблема заключается в том, что все существующие записи «пользователя» (которые я назову MyUser) имеютпустые поля Core Identity и, таким образом, невидимы для системных вызовов.

Я хотел бы написать утилиту, которая просматривает существующие записи MyUser, и, если поле AspIdentityId имеет значение null, установите его в качестве записи, управляемой подсистемой Identity.

По сути, я ищу вызов 'Create', но не могу использовать UserManager.

CreateAsync, потому что это создает новую запись в таблице, но не обновляет существующую.один.

У меня есть два контекста БД (IdentityDBContext и OriginalDBContext), поэтому, если есть что-то, что позволяет мне генерировать данные поля, я могу затем добавить это в столбцы таблицы для связанной записи.

1 Ответ

0 голосов
/ 28 августа 2018

Хорошо, я заставил это работать, не совсем уверенный, почему это работает, похоже, что поля AspIdentity заполняются до того, как они будут зафиксированы.Я только добавил конкретные изменения, которые были суть вопроса, DI, настройка контекстов и т. Д. В другом месте в проекте.

По сути, для каждой записи «домена» я создаю новую запись ApplicationUser (производную от IdentityUser) и добавляю значения для настраиваемых полей в записи домена в запись ApplicationUser.Как только этот объект создан, у него уже есть необходимые поля Asp.Net Identity.Затем я получаю эти поля и заполняю их обратно в запись, относящуюся к домену, а затем сохраняю это.Как только это будет сделано, я заново найду запись (это может не потребоваться) и добавлю пароль на основе обычного текстового пароля, уже имеющегося в записи домена.

        var clients = new List<Client>(myService.myContext.Clients);

        foreach (var client in clients)
        {
            var user = new ApplicationUser // Derived from IdentityUser
            {
                UserID = client.UserID,
                FirstName = client.FirstName,
                LastName = client.LastName,
                UserName = client.UserName,
                PhoneNumber = client.Phone,
                Email = client.Email         // Other fields omitted for brevity.
            };

            var idUser = user as IdentityUser;
            client.AspIdentityId = user.Id;
            client.ConcurrencyStamp = user.ConcurrencyStamp;
            client.NormalizedEmail = user.NormalizedEmail;
            client.NormalizedUserName = user.NormalizedUserName;
            client.PasswordHash = user.PasswordHash;
            client.SecurityStamp = user.SecurityStamp;

            myService.myContext.SaveChanges();

            // Can we just use the 'user' object here?
            var newUser = await myService.UserManager.FindByIdAsync(client.AspIdentityId);
            var result = await myService.UserManager.AddPasswordAsync(newUser, client.Password);
       }

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...