gpt4 book ai didi

c# - 使用 EF Core 3.1 在 SQL Server 上生成不可为空的行版本

转载 作者:行者123 更新时间:2023-12-04 01:14:46 25 4
gpt4 key购买 nike

我们正在尝试使用 Fluent API 在带有 EF Core 3.1 的 SQL Server 上生成不可为空的 rowversion 列:

public class Person
{
public int Id { get; set; }
public byte[] Timestamp { get; set; }
}

public class PersonEntityConfiguration : IEntityTypeConfiguration<Person>
{
public void Configure(EntityTypeBuilder<Person> builder)
{
builder.HasKey(p => p.Id);

builder.Property(p => p.Timestamp)
.IsRowVersion()
.IsRequired();
}
}
当整个表都是新的时,这可以正常工作:
public partial class PersonMigration : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Persons",
columns: table => new
{
Id = table.Column<int>(nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
Timestamp = table.Column<byte[]>(rowVersion: true, nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Persons", x => x.Id);
});
}
}
但是,我们有时需要将行版本添加到现有表中。在这种情况下,EF Core 会生成无效的迁移:
public partial class PersonTimestampMigration : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<byte[]>(
name: "Timestamp",
table: "Persons",
rowVersion: true,
nullable: false,
defaultValue: new byte[] { });
}
}
上面生成的默认值应用到数据库时会导致异常:

Failed executing DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']

ALTER TABLE [Persons] ADD [Timestamp] rowversion NOT NULL DEFAULT 0x;

Microsoft.Data.SqlClient.SqlException (0x80131904): Defaults cannot be created on columns of data type timestamp. Table 'Persons', column 'Timestamp'.
Could not create constraint or index. See previous errors.


这是 EF Core 中的已知错误吗?该问题可以通过手动删除 defaultValue: new byte[] { } 来解决。来自迁移,但是有没有办法禁止使用 Fluent API 生成默认值?

最佳答案

Is this a known bug in EF Core?


它肯定是错误/缺陷,但可能未知,因为即使在此时的最新 EF Core 5.0 预览版中也会发生这种情况。或者是已知的,但优先级较低(对他们而言)-您必须检查 EF Core Issue Tracker .
尝试明确添加 .HasDefaultValue(null).HasDefaultValueSql(null) - 没有任何帮助,所以唯一的选择是手动删除 defaultValue: new byte[] { }从迁移。好消息是,当您这样做时,它会工作并且该列被成功创建和填充,即使该表具有现有记录(这就是 EF Core 通常为新的必需列添加此类 defaultValue 参数的原因,但正如我们see 不应该为 ROWVERSION 这样做)。

关于c# - 使用 EF Core 3.1 在 SQL Server 上生成不可为空的行版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63703638/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com