UserManager 抛出异常 - 无法跟踪实体,因为主键属性“Id”为空 - 从 .Net Core 2.2 升级到 3.0 后

Jen*_*nan 8 entity-framework-core asp.net-core asp.net-core-identity

我使用了UserIdentityUserusing派生的自定义实现Asp.Net Core Identity

public class AppUser : IdentityUser
    {
        ...
    }
Run Code Online (Sandbox Code Playgroud)

如果我调用该方法:

var identityResult = await UserManager.CreateAsync(user);
Run Code Online (Sandbox Code Playgroud)

我收到错误:

System.InvalidOperationException:无法跟踪“AppUser”类型的实体,因为主键属性“Id”为空。

它的工作原理完全符合的版本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

Iva*_*oev 21

有EF核心3.0引入了重大更改字符串和字节数组键没有客户端生成的默认情况下它会影响其使用实体stringPK喜欢IdentityUser<string>IdentityRole<string>和将导致异常,如果PK未明确设置。

然而,默认IdentityUserIdentityRole类也被修改为Id使用Guid.NewGuid().ToString()内部类构造函数填充属性。所以通常你不应该有这个问题,除非某些代码明确设置了Idto null。无论如何,您可以使用链接中的建议切换到旧行为

缓解措施

3.0 之前的行为可以通过明确指定如果没有设置其他非空值,键属性应该使用生成的值来获得。

例如OnModelCreating,在调用基本实现之后,内部上下文覆盖:

modelBuilder.Entity<AppUser>()
    .Property(e => e.Id)
    .ValueGeneratedOnAdd();
Run Code Online (Sandbox Code Playgroud)