微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在具有EF Core 3.1的SQL Server上生成不可为空的rowversion

如何解决在具有EF Core 3.1的SQL Server上生成不可为空的rowversion

我们正在尝试使用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);
            });
    }
}

但是,有时我们需要将rowversion添加到现有表中。在这种情况下,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[] {  });
    }
}

上面生成认值在应用于数据库时将导致异常:

执行DbCommand失败(1ms)[Parameters = [],CommandType ='Text',CommandTimeout = '30']

ALTER TABLE [人员]添加[时间戳]行版本非NULL认值0x;

Microsoft.Data.sqlClient.sqlException(0x80131904):无法在数据类型为timestamp的列上创建认值。表“人员”,列“时间戳”。
无法创建约束或索引。查看先前的错误

这是EF Core中的已知错误吗?可以通过从迁移中手动删除defaultValue: new byte[] { }解决此问题,但是有什么方法可以抑制使用Fluent API生成认值?

解决方法

这是EF Core中的已知错误吗?

这肯定是错误/缺陷,但可能未知,因为即使在最新的EF Core 5.0预览版中,它也确实在发生。还是已知的,但是优先级较低(对于他们而言)-您必须检查EF Core Issue Tracker

尝试显式添加.HasDefaultValue(null).HasDefaultValueSql(null)-没有帮助,因此唯一的选择是从迁移中手动删除defaultValue: new byte[] { }。这样做的好处是,即使表具有现有记录,这样做也可以正常工作,并且可以成功创建和填充列(这就是EF Core通常为新的必需列添加此类defaultValue参数的原因,但是如我们所见,不应该对ROWVERSION这样做)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。