UserManager выдает исключение - невозможно отследить сущность, поскольку свойство первичного ключа 'Id' равно нулю - после обновления с .Net Core 2.2 до 3.0 - PullRequest
2 голосов
/ 06 ноября 2019

Я использовал пользовательскую реализацию User, которая получена из IdentityUser с использованием Asp.Net Core Identity:

public class AppUser : IdentityUser
    {
        ...
    }

Если я вызываю метод:

var identityResult = await UserManager.CreateAsync(user);

Я получаю сообщение об ошибке:

System.InvalidOperationException: невозможно отследить сущность типа «AppUser», так как свойство первичного ключа «Id» имеет значение null.

Работает отличнос версией Microsoft.AspNetCore.Identity.EntityFrameworkCore - 2.2.0, но после обновления до 3.0.0 - не работает.

Я получаю ту же ошибку и при тестировании создания пользователя, там я использую следующее UserManager конфигурация:

https://github.com/aspnet/AspNetCore/blob/c95ee2b051814b787b07f55ff224d03d550aafeb/src/Identity/test/Shared/MockHelpers.cs#L37

1 Ответ

3 голосов
/ 06 ноября 2019

В EF Core 3.0 введено критическое изменение Ключи строк и байтового массива по умолчанию не генерируются клиентом , что влияет на объекты, использующие string PK, такие как IdentityUser<string> и IdentityRole<string>, и приводит к тому, чтоисключение, если PK не установлен явно.

Однако классы IdentityUser и IdentityRole по умолчанию также были изменены, чтобы заполнить свойство Id Guid.NewGuid().ToString() внутри конструкторов классов. Поэтому обычно у вас не должно быть этой проблемы, кроме случаев, когда какой-то код явно устанавливает Id в null. В любом случае, вы можете переключиться на старое поведение, используя предложение по ссылке

Смягчения

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

например, внутри контекста OnModelCreating переопределение, после вызова базовой реализации:

modelBuilder.Entity<AppUser>()
    .Property(e => e.Id)
    .ValueGeneratedOnAdd();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...