ParallelitätstokenConcurrency Tokens

Wenn eine Eigenschaft als ein parallelitätstoken konfiguriert ist prüft EF dann, dass kein anderer Benutzer beim Speichern der Änderungen an diesen Datensatz der Wert in der Datenbank nicht geändert wurde.If a property is configured as a concurrency token then EF will check that no other user has modified that value in the database when saving changes to that record. EF ein Muster für die vollständige Parallelität verwendet, d. h. sie wird wird davon ausgegangen, dass der Wert nicht geändert hat und versuchen Sie es, speichern Sie die Daten auszulösen, wenn es feststellt, dass der Wert geändert wurde.EF uses an optimistic concurrency pattern, meaning it will assume the value has not changed and try to save the data, but throw if it finds the value has been changed.

Wir möchten z. B. konfigurieren LastName auf Person ein parallelitätstoken ist.For example we may want to configure LastName on Person to be a concurrency token. Dies bedeutet, dass, wenn ein Benutzer versucht, speichern einige Änderungen an einer Person, jedoch einem anderen Benutzer geändert wurde die LastName und dann eine Ausnahme ausgelöst wird.This means that if one user tries to save some changes to a Person, but another user has changed the LastName then an exception will be thrown. Dies kann wünschenswert sein, damit Ihre Anwendung kann der Benutzer aufgefordert, stellen Sie sicher, dass dieser Datensatz weiterhin dieselbe tatsächlichen Person darstellt, bevor Sie ihre Änderungen speichern.This may be desirable so that your application can prompt the user to ensure this record still represents the same actual person before saving their changes.

Hinweis

Auf dieser Seite dokumentiert, wie Sie parallelitätstoken zu konfigurieren.This page documents how to configure concurrency tokens. Finden Sie unter Behandeln von Parallelität für Beispiele für vollständige Parallelität in Ihrer Anwendung verwenden.See Handling Concurrency for examples of how to use optimistic concurrency in your application.

Funktionsweise von parallelitätstoken in EFHow concurrency tokens work in EF

Datenspeicher können parallelitätstoken erzwingen, indem Sie überprüfen, dass ein Datensatz, aktualisieren oder löschen noch den gleichen Wert für die parallelitätstoken, der zugewiesen wurde verfügt, wenn der Kontext ursprünglich die Daten aus der Datenbank geladen.Data stores can enforce concurrency tokens by checking that any record being updated or deleted still has the same value for the concurrency token that was assigned when the context originally loaded the data from the database.

Z. B. relationale Datenbanken erreichen, indem z. B. im parallelitätstoken in der WHERE Klausel beliebiger UPDATE oder DELETE Befehle und überprüfen die Anzahl der Zeilen, die betroffen sind.For example, relational databases achieve this by including the concurrency token in the WHERE clause of any UPDATE or DELETE commands and checking the number of rows that were affected. Wenn immer noch im parallelitätstoken übereinstimmt, wird eine Zeile aktualisiert werden.If the concurrency token still matches then one row will be updated. Wenn der Wert in der Datenbank geändert wurde, werden keine Zeilen aktualisiert.If the value in the database has changed, then no rows are updated.

UPDATE [Person] SET [FirstName] = @p1
WHERE [PersonId] = @p0 AND [LastName] = @p2;

KonventionenConventions

Gemäß der Konvention werden die Eigenschaften nie als parallelitätstoken konfiguriert.By convention, properties are never configured as concurrency tokens.

DatenanmerkungenData Annotations

Sie können die Datenanmerkungen so konfigurieren Sie eine Eigenschaft als ein parallelitätstoken verwenden.You can use the Data Annotations to configure a property as a concurrency token.

public class Person
{
    public int PersonId { get; set; }

    [ConcurrencyCheck]
    public string LastName { get; set; }

    public string FirstName { get; set; }
}

Fluent-APIFluent API

Sie können die Fluent-API verwenden, so konfigurieren Sie eine Eigenschaft als ein parallelitätstoken.You can use the Fluent API to configure a property as a concurrency token.

class MyContext : DbContext
{
    public DbSet<Person> People { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Person>()
            .Property(p => p.LastName)
            .IsConcurrencyToken();
    }
}

public class Person
{
    public int PersonId { get; set; }
    public string LastName { get; set; }
    public string FirstName { get; set; }
}

Timestamp/ZeilenversionTimestamp/row version

Ein Zeitstempel ist eine Eigenschaft, wird ein neuer Wert von der Datenbank generiert jedes Mal, wenn eine Zeile eingefügt oder aktualisiert wird.A timestamp is a property where a new value is generated by the database every time a row is inserted or updated. Die Eigenschaft wird auch als ein parallelitätstoken behandelt.The property is also treated as a concurrency token. Dadurch wird sichergestellt, dass eine Ausnahme erhalten Sie, wenn andere Benutzer eine Zeile geändert hat, die aktualisiert werden, weil Sie für die Daten abgefragt werden soll.This ensures you will get an exception if anyone else has modified a row that you are trying to update since you queried for the data.

Wird dies erreicht ist, bis zu der Datenbankanbieter verwendet wird.How this is achieved is up to the database provider being used. Für SQL Server wird in der Regel Zeitstempel auf verwendet eine Byte [] setup-Eigenschaft, die als eine ROWVERSION Spalte in der Datenbank.For SQL Server, timestamp is usually used on a byte[] property, which will be setup as a ROWVERSION column in the database.

KonventionenConventions

Gemäß der Konvention werden die Eigenschaften nie als Zeitstempel konfiguriert.By convention, properties are never configured as timestamps.

DatenanmerkungenData Annotations

Datenanmerkungen können Sie eine Eigenschaft als Zeitstempel konfigurieren.You can use Data Annotations to configure a property as a timestamp.

public class Blog
{
    public int BlogId { get; set; }

    public string Url { get; set; }
    
    [Timestamp]
    public byte[] Timestamp { get; set; }
}

Fluent-APIFluent API

Sie können die Fluent-API verwenden, so konfigurieren Sie eine Eigenschaft als einen Zeitstempel.You can use the Fluent API to configure a property as a timestamp.

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .Property(p => p.Timestamp)
            .IsRowVersion();
    }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
    public byte[] Timestamp { get; set; }
}