Ho impostato una colonna RowVersion per la mia entità ma sembra che non stia memorizzando nulla su creazioni o aggiornamenti.
ha questa configurazione in DbContext OnModelCreating
:
modelBuilder.Entity<Author>()
.Property(a => a.RowVersion)
.IsConcurrencyToken()
.ValueGeneratedOnAddOrUpdate();
Tuttavia, la colonna RowVersion è sempre NULL, anche dopo l'aggiornamento / creazione di un'entità.
A proposito, sto usando PostgreSQL con la libreria Npgsql (NuGet). Nei documenti, afferma che PostgreSQL non supporta i valori calcolati su add o update
È il motivo per cui non funziona?
Se è così, perché possiamo eludere questa limitazione?
Inoltre, ho provato con:
modelBuilder.Entity<Author>().Property<byte[]>("RowVersion")
.HasColumnName(ShadowPropertiesDb.RowVersion)
.IsRowVersion();
Risulta lo stesso problema.
In PostgreSQL RowVersion è predefinito come una colonna denominata "xmin".
Proprietà di esempio (solo per Npgsql):
[ConcurrencyCheck]
[Column("xmin",TypeName = "xid")]
public long RowVersion { get; set; }
Se si desidera che la proprietà sia di tipo byte []:
Passaggio 1: modifica il tipo di proprietà in byte []
[ConcurrencyCheck]
[Column("xmin",TypeName = "xid")]
public byte[] RowVersion { get; set; }
Passaggio 2: aggiungi convertitore in "OnModelCreating (builder ModelBuilder)"
var converter = new ValueConverter<byte[], long>(
v => BitConverter.ToInt64(v, 0),
v => BitConverter.GetBytes(v));
builder.Entity<Author>()
.Property(_ => _.RowVersion)
.HasConversion(converter);
================ Per molti tipi di database =================
Proprietà:
[ConcurrencyCheck]
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public byte[] RowVersion { get; set; }
In "OnModelCreating (Builder 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);
}