【问题标题】:Unable to track an entity of type because primary key property 'id' is null无法跟踪类型实体,因为主键属性“id”为空
【发布时间】:2020-03-26 19:11:18
【问题描述】:

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

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

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

这是发生错误的代码行:

var result = await _userManager.CreateAsync(user, password);

【问题讨论】:

标签: c# asp.net asp.net-core entity-framework-core


【解决方案1】:

这为我解决了这个问题。

    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;
        }
    }

【讨论】:

  • 谢谢!完美的解决方案!
【解决方案2】:

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

https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.0/breaking-changes#string-and-byte-array-keys-are-not-client-generated-by-default

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

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

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

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

modelBuilder
    .Entity<Blog>()
    .Property(e => e.Id)
    .ValueGeneratedOnAdd();

或带有数据注释:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public string Id { get; set; }

【讨论】:

    猜你喜欢
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    • 2020-01-31
    • 2019-12-29
    • 1970-01-01
    • 2022-01-26
    相关资源
    最近更新 更多