gpt4 book ai didi

c# - Entity Framework Core RowVersion 列未使用 PostgreSQL 更新

转载 作者:行者123 更新时间:2023-11-29 11:46:51 24 4
gpt4 key购买 nike

我已经为我的实体设置了一个 RowVersion 列,但它似乎没有在创建或更新时存储任何内容。

它在 DbContext OnModelCreating 中有这个配置:

 modelBuilder.Entity<Author>()
.Property(a => a.RowVersion)
.IsConcurrencyToken()
.ValueGeneratedOnAddOrUpdate();

但是,即使在实体更新/创建之后,RowVersion 列始终为 NULL。

顺便说一句,我将 PostgreSQL 与 Npgsql 库 (NuGet) 结合使用。在文档中,它说 PostgreSQL doesn't support computed values on add or update

这就是它不起作用的原因吗?

如果是这样,我们为什么要绕过这个限制?

另外,我测试过:

modelBuilder.Entity<Author>().Property<byte[]>("RowVersion")
.HasColumnName(ShadowPropertiesDb.RowVersion)
.IsRowVersion();

它会导致同样的问题。

最佳答案

在 PostgreSQL 中,RowVersion 被预定义为名为“xmin”的列。

示例属性(仅适用于 Npgsql):

[ConcurrencyCheck]
[Column("xmin",TypeName = "xid")]
public long RowVersion { get; set; }

如果你希望属性是 byte[] 类型:

第 1 步:将属性类型更改为 byte[]

[ConcurrencyCheck]
[Column("xmin",TypeName = "xid")]
public byte[] RowVersion { get; set; }

第二步:在“OnModelCreating(ModelBuilder builder)”中添加转换器

var converter = new ValueConverter<byte[], long>(
v => BitConverter.ToInt64(v, 0),
v => BitConverter.GetBytes(v));

builder.Entity<Author>()
.Property(_ => _.RowVersion)
.HasConversion(converter);

================对于许多数据库类型=================

属性:

[ConcurrencyCheck]
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public byte[] RowVersion { get; set; }

在“OnModelCreating(ModelBuilder 构建器)”中:

if (Database.IsNpgsql())
{
var converter = new ValueConverter<byte[], long>(
v => BitConverter.ToInt64(v, 0),
v => BitConverter.GetBytes(v));

builder.Entity<Author>()
.Property(_ => _.RowVersion)
.HasColumnName("xmin")
.HasColumnType("xid")
.HasConversion(converter);
}

关于c# - Entity Framework Core RowVersion 列未使用 PostgreSQL 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47281414/

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