我已经为我的实体设置了一个RowVersion列,但它似乎没有存储任何有关创建或更新的内容。
它在DbContext OnModelCreating中具有此配置
modelBuilder.Entity<Author>()
.Property(a => a.RowVersion)
.IsConcurrencyToken()
.ValueGeneratedOnAddOrUpdate();但是,即使在实体更新/创建之后,RowVersion列也始终为NULL。
顺便说一下,我在Npgsql库(NuGet)中使用PostgreSQL。在文件里,PostgreSQL doesn't support computed values on add or update说
这是它不起作用的原因吗?
如果是这样,为什么我们可以绕过这个限制呢?
另外,我还测试过:
modelBuilder.Entity<Author>().Property<byte[]>("RowVersion")
.HasColumnName(ShadowPropertiesDb.RowVersion)
.IsRowVersion();它会导致同样的问题。
发布于 2019-02-14 22:13:55
在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; }步骤2:在"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 Builder)“中:
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);
}https://stackoverflow.com/questions/47281414
复制相似问题