Entity Framework Core 尝试更新模型中标记为标识的列
Entity Framework Core attempting to update column marked as Identity in model
我有一个数据库 table,其中一列是 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; }
}
尽管有注释,当我对 table 进行更新时,我发现生成的 SQL 试图更新 IDENTITY
列:
UPDATE [Model] SET ... [AnotherId] = @p10 ...
WHERE [Id] = @p29;
SELECT @@ROWCOUNT;
这显然失败了,导致抛出异常。我正在使用 Entity Core 2.0,目前无法升级到 2.1。知道为什么数据注释被忽略了吗?
尝试 Fluent API in OnModelCreating
的 Context
class。像这样:
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)]
根据 the docs.
我在 EF Core 3.1 中的解决方案是这样的:
partial void OnModelCreatingPartial(ModelBuilder modelBuilder)
{
modelBuilder.Entity<YourTableName>().Property(c => c.YourPropertyName).UseIdentityColumn().ValueGeneratedOnAddOrUpdate();
}
在没有 ValueGeneratedOnAddOrUpdate() 的情况下,我在更新现有记录时看到了与 OP 相同的错误。因此看起来 UseIdentityColumn() 等同于调用 ValueGeneratedOnAdd()。
我有一个数据库 table,其中一列是 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; }
}
尽管有注释,当我对 table 进行更新时,我发现生成的 SQL 试图更新 IDENTITY
列:
UPDATE [Model] SET ... [AnotherId] = @p10 ...
WHERE [Id] = @p29;
SELECT @@ROWCOUNT;
这显然失败了,导致抛出异常。我正在使用 Entity Core 2.0,目前无法升级到 2.1。知道为什么数据注释被忽略了吗?
尝试 Fluent API in OnModelCreating
的 Context
class。像这样:
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)]
根据 the docs.
我在 EF Core 3.1 中的解决方案是这样的:
partial void OnModelCreatingPartial(ModelBuilder modelBuilder)
{
modelBuilder.Entity<YourTableName>().Property(c => c.YourPropertyName).UseIdentityColumn().ValueGeneratedOnAddOrUpdate();
}
在没有 ValueGeneratedOnAddOrUpdate() 的情况下,我在更新现有记录时看到了与 OP 相同的错误。因此看起来 UseIdentityColumn() 等同于调用 ValueGeneratedOnAdd()。