无法更新标识列“索引”。 EF核心

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法更新标识列“索引”。 EF核心相关的知识,希望对你有一定的参考价值。

就像标题所说,我在尝试更新EF Core中的实体时收到错误消息。

这是我正在尝试更新的实体。注意使用Databasegenerated属性修饰的Index属性。 enter image description here

我尝试装饰wthe属性,因此只有在添加新实体时才会生成一个值,但是没有成功。

enter image description here

关于这个链接:http://ef.readthedocs.io/en/latest/modeling/generated-properties.html#value-generated-on-add

最后,更新方法如下所示:

enter image description here

我在这做错了什么?

答案

对于遇到这种情况的人来说,这是EF Core 1.0的一个错误。见https://github.com/aspnet/EntityFramework/issues/6426

它已在EF Core 1.2中标记为已修复。

另一答案

您似乎正在组合太多不同的方法(Fluent和Data Annotation)。你应该坚持其中一个。并且在连接模型时应该有一个键(因此EF知道要附加什么)。

或者:

builder.Entity<Section>()
            .HasKey(p => p.Index);
builder.Entity<Section>()
            .Property(p => p.Index)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

要么

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key, Column(Order = 0)]
public int Index { get; set; }

编辑:

如果要更改标识列的值,可以执行以下操作:

try
{
    _context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [dbo].[Section] ON");
    //Do updates
    _context.SaveChanges();
}
finally()
{
   _context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [dbo].[Section] OFF");
}

您可能需要重新创建该列而不是更新它。

另一答案

我也有这个问题!!我试图为我的属性添加注释[Key,Column(Order = 1)],但它不起作用。

尝试以下方法。我用它来解决我的问题(.Net Core和EF Core 1.1.1)

1.请在Context.cs中添加这些代码

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

   // Adding the code below tells DB "NumericId is an AlternateKey and don't update".
   modelBuilder.Entity<User>()
   .HasAlternateKey(x => x.Index ).HasName("IX_Index");
}

2.在“包管理器”窗口中,执行update-database

参考:

[Stackoverflow] Unique Key Constraints For Multiple Columns In EntityFramework

[MSDN] Alternate Keys (Unique Constraints)

以上是关于无法更新标识列“索引”。 EF核心的主要内容,如果未能解决你的问题,请参考以下文章

无法更新标识列 SQL Server 2014 [重复]

多部分标识符无法绑定更新列

为什么EF核心会忽略我对数据集的更新?

尝试使用标识列添加新条目时,EF6 引发并发异常

无法更新 Entity Framework Core 中的标识列

如何使用 EF 核心在 SQLite 中创建自动增量列?