Sowohl in EF6 als auch in EF-Core müssen Sie beim Arbeiten mit Sql Server diese Zuordnung verwenden:
modelBuilder.Entity<Product>()
.Property(t => t.RowVersion)
.IsRowVersion(); // Not: IsConcurrencyToken
IstConcurrencyToken konfiguriert zwar eine Eigenschaft als Parallelitätstoken, aber (bei Verwendung für ein byte[] Eigentum)
- der Datentyp ist
varbinary(max) - sein Wert ist immer
nullwenn Sie es nicht initialisieren - sein Wert wird nicht automatisch erhöht, wenn ein Datensatz aktualisiert wird.
IstRowVersion andererseits
- hat den Datentyp
rowversion(in SQL Server odertimestampin früheren Versionen), also - sein Wert ist niemals null, und
- sein Wert wird immer automatisch erhöht, wenn ein Datensatz aktualisiert wird.
- und es konfiguriert die Eigenschaft automatisch als optimistisches Nebenläufigkeitstoken.
Wenn Sie jetzt ein Car aktualisieren Sie werden zwei Update-Anweisungen sehen:
DECLARE @p int
UPDATE [dbo].[Product]
SET @p = 0
WHERE (([Id] = @0) AND ([Rowversion] = @1))
SELECT [Rowversion]
FROM [dbo].[Product]
WHERE @@ROWCOUNT > 0 AND [Id] = @0
UPDATE [dbo].[Car]
SET ...
Die erste Anweisung aktualisiert nichts, aber sie erhöht die Zeilenversion und löst eine Nebenläufigkeitsausnahme aus, wenn die Zeilenversion zwischenzeitlich geändert wurde.
Der [System.ComponentModel.DataAnnotations.Schema.Timestamp] -Attribut ist das Datenanmerkungsäquivalent von IsRowVersion() :
[Timestamp]
public byte[] RowVersion { get; set; }