The IsConcurrencyToken
method is used to specify that a property should be included in a WHERE
clause in an UPDATE
or DELETE
statement as part of concurrency management.
language-csharp
|
public class SampleContext : DbContext { public DbSet<Author> Authors { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Author>() .Property(a => a.FirstName).IsConcurrencyToken(); modelBuilder.Entity<Author>() .Property(a => a.LastName).IsConcurrencyToken(); } } public class Author { public int AuthorId { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string Biography { get; set; } public ICollection<Book> Books { get; set; } }
When applied to a byte array property in combination with the ValueGeneratedOnAddOrUpdate method, the IsConcurrencyToken
method denotes that the property should map to a database type that provides automatic row-versioning, such as the SQL Server rowversion
type:
language-csharp
|
public class SampleContext : DbContext { public DbSet<Author> Authors { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Author>() .Property(a => a.RowVersion) .IsConcurrencyToken() .ValueGeneratedOnAddOrUpdate(); } } public class Author { public int AuthorId { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string Biography { get; set; } public ICollection<Book> Books { get; set; } public byte[] RowVersion { get; set; } }
Data Annotations
The Data Annotations equivalents to the IsConcurrencyToken
method are the ConcurrencyCheck attribute and the Timestamp attribute.