Entity Framework Core RowVersion列未使用PostgreSQL进行更新

时间:2017-11-14 08:56:48

标签: c# postgresql entity-framework concurrency entity-framework-core

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

它在DbContext import { Component } from '@angular/core'; import { NavController, App } from 'ionic-angular'; import { LoggedInComponent } from '../../pages/loggedIn/loggedIn.component'; @Component({ selector: 'page-home', templateUrl: 'home.html' }) export class HomePage { constructor(public navCtrl: NavController, public app : App) { this.loggedInPage=LoggedInComponent; } goTopage(){ this.app.getRootNav().setRoot(this.loggedInPage); } } 中具有此配置:

OnModelCreating

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

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

这是它无法运作的原因吗?

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

另外,我已经测试过:

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

导致同样的问题。

1 个答案:

答案 0 :(得分:1)

在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(模型构建器构建器)”中:

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);
}