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
null
wenn 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 odertimestamp
in 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; }