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

时间:2016-05-27 07:28:36

标签: .net ef-code-first entity-framework-core

就像标题所说的那样,当我尝试更新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

我在这里做错了什么?

3 个答案:

答案 0 :(得分:2)

对于遇到此问题的人来说,这是EF Core 1.0的一个错误。请参阅https://github.com/aspnet/EntityFramework/issues/6426

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

答案 1 :(得分:1)

您似乎正在组合过于不同的方法( 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");
}

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

答案 2 :(得分:1)

我也有这个问题!!我尝试为我的属性添加注释[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。在 PackageManager 窗口中,执行 update-datebase

参考:

[Stackoverflow] Unique Key Constraints For Multiple Columns In EntityFramework

[MSDN] Alternate Keys (Unique Constraints)