就像标题所说的那样,当我尝试更新EF Core中的实体时,我收到了错误消息。
这是我尝试更新的实体。注意使用Databasegenerated属性修饰的Index属性。
我尝试装饰wthe属性,因此只有在添加新实体时才会生成一个值,但是没有成功。
关于此链接:http://ef.readthedocs.io/en/latest/modeling/generated-properties.html#value-generated-on-add
最后,更新方法如下所示:
我在这里做错了什么?
答案 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