实体框架核心正在尝试更新模型中标记为"标识"的列



我有一个数据库表,其中一列是IDENTITY列(不是手动设置的主键(。我的EF Core型号如下:

public class Model
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }
...Other fields...
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int AnotherId { get; set; }
}

尽管有注释,但当我对表进行更新时,我发现生成的SQL试图更新IDENTITY列:

UPDATE [Model] SET ... [AnotherId] = @p10 ...
WHERE [Id] = @p29;
SELECT @@ROWCOUNT;

这显然失败了,导致抛出异常。我正在使用实体核心2.0,目前无法升级到2.1。你知道为什么数据注释被忽略了吗?

EF Core 3.1中的解决方案是:

partial void OnModelCreatingPartial(ModelBuilder modelBuilder)
{
modelBuilder.Entity<YourTableName>().Property(c => c.YourPropertyName).UseIdentityColumn().ValueGeneratedOnAddOrUpdate();
}

如果没有ValueGeneratedOnAddOrUpdate((,我在更新现有记录时会看到与OP相同的错误。因此,看起来UseIdentityColumn((相当于调用ValueGeneratedOnAdd((。

Context类的OnModelCreating中尝试Fluent API。类似这样的东西:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder
.Entity<Model>()
.Property(c => c.AnotherId )
.UseSqlServerIdentityColumn();
}

同样在EF Core 2中,它应该是这样的:

modelBuilder.Property(c => c.AnotherId).UseSqlServerIdentityColumn();
modelBuilder.Property(p => p.AnotherId )
.Metadata.AfterSaveBehavior = PropertySaveBehavior.Ignore;

您可能想要使用的属性是:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]

根据文件。

相关内容

  • 没有找到相关文章

最新更新