c# - 升级到 EF Core 2.0 : System. InvalidOperationException: 属性 'Id' 不能配置为 'ValueGeneratedOnUpdate'

标签 c# asp.net-core entity-framework-core ef-core-2.0

我正在将 Asp.Net Core 1.1 应用程序升级到 Asp.Net Core 2.0。

我在所有 Entity Framework 2.0 查询中遇到一个常见错误:

System.InvalidOperationException: The property 'Id' cannot be 
configured as 'ValueGeneratedOnUpdate' or 'ValueGeneratedOnAddOrUpdate'
because the key value cannot be changed after the entity has been 
added to the store.

此错误是通过以下查询获得的:

var themes = await _context.Themes.ToListAsync();

Theme 实体如下:

public class Theme
{
    public Int32 Id { get; set; }

    public String Name { get; set; }

    public virtual ICollection<Book> Books { get; set; }
} // Theme    

其配置如下:

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);

    builder.Entity<Theme>(b => 
    {
        b.ToTable("Themes");

        b.HasKey(x => x.Id);

        b.Property(x => x.Id).UseSqlServerIdentityColumn();

        b.Property(x => x.Name).IsRequired(true).HasMaxLength(200);

        b.HasIndex(x => x.Name).IsUnique();
    });
}

在 Startup 项目中,我有以下内容:

services.AddDbContext<Context>(x => x.UseSqlServer(connectionString));

我尝试了不同的查询和实体,但我不断收到此错误。

我错过了什么?

最佳答案

据我了解您的问题,您无法为 Id 设置自动增量属性(property)。

只需删除行 b.Property(x => x.Id).UseSqlServerIdentityColumn();b.HasIndex(x => x.Name).IsUnique();因为HasKey将已经设置自动增量。有关更多信息,您可以阅读此 MS docs article - Keys (primary) . 我也删除了表映射,因为表名复数化默认是激活的。

你的 OnModelCreating应该如下所示:

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);

    builder.Entity<Theme>(b => {

        b.HasKey(x => x.Id);

        b.Property(x => x.Name).IsRequired(true).HasMaxLength(200);
    });
}

仅出于可读性考虑,我更喜欢以下代码:

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);

    var themeEntity = builder.Entity<Theme>();

    themeEntity.HasKey(x => x.Id);

    themeEntity.Property(x => x.Name)
        .HasMaxLength(200)
        .IsRequired(true);
}

更好的方法是将实体配置提取到它们自己实现的类中 IEntityTypeConfiguration<T> (configuration separation)。

关于c# - 升级到 EF Core 2.0 : System. InvalidOperationException: 属性 'Id' 不能配置为 'ValueGeneratedOnUpdate',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46183852/

相关文章:

c# - Linq 选择模型并设置属性

c# - 具有相同返回类型和名称的 MessageBodyMembers 导致异常 - 元素已导出

c# - .NET Core 添加/注册一个类作为自身到服务集合

asp.net-core - 检查程序包是否与.net核心兼容

visual-studio - .Net Core 通过选择配置在应用程序设置之间自动更改

c# - EF Core 5 - 内存中对象列表过滤不适用于 DBset

entity-framework-core - 在 EF Core 中如何选择特定列并保存

c# - Math.Round for decimal

c# - 如何在.net 3.5 中实现动态特性

时间:2019-05-17 标签:c#winform: node expand and collapse in TreeView