无法跟踪类型的实体,因为主键属性“id”为空

Tom*_*adi 19 c# asp.net entity-framework-core asp.net-core

升级到 Asp.Net Core 3.0 后,当我尝试创建用户时,我的 Identity 类出现以下错误:

无法跟踪类型为“用户”的实体,因为主键属性“id”为空。

这里 User 代表我对 Identity 模型的扩展。

这是发生错误的代码行:

var result = await _userManager.CreateAsync(user, password);
Run Code Online (Sandbox Code Playgroud)

Tom*_*adi 43

这是由于 EF Core 3.0 中的重大更改,可在此链接下找到:

https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.0/break-changes#string-and-byte-array-keys-are-not-client-默认生成

这个问题可以通过像这样手动分配一个键来解决:

// assign GUID to Id
user.Id = Guid.NewGuid().ToString();
var result = await _userManager.CreateAsync(user, password);
Run Code Online (Sandbox Code Playgroud)

根据微软的说法,另一种解决方案如下:

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

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

或者使用数据注释:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public string Id { get; set; }
Run Code Online (Sandbox Code Playgroud)


Zoi*_*arp 13

这为我解决了这个问题。

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
        var keysProperties = builder.Model.GetEntityTypes().Select(x => x.FindPrimaryKey()).SelectMany(x => x.Properties);
        foreach (var property in keysProperties)
        {
            property.ValueGenerated = ValueGenerated.OnAdd;
        }
    }

Run Code Online (Sandbox Code Playgroud)