我为我的实体设置了一个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();
导致同样的问题。
答案 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);
}