Tokeny współbieżnościConcurrency Tokens

Jeśli właściwość jest skonfigurowana jako tokenu współbieżności następnie EF sprawdzi żaden inny użytkownik zmodyfikował tę wartość w bazie danych podczas zapisywania zmian w tym rekordzie.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 korzysta ze wzorca optymistycznej współbieżności, czyli będzie przyjęto założenie, że nie zmieniono wartość i spróbuj zapisać dane, ale zgłoszenia, jeśli znajdzie się, że wartość została zmieniona.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.

Na przykład firma Microsoft może być konieczne skonfigurowanie LastName na Person być tokenem współbieżności.For example we may want to configure LastName on Person to be a concurrency token. Oznacza to, że jeśli jeden użytkownik próbuje zapisać pewnych zmian Person, ale został zmieniony przez innego użytkownika LastName , a następnie zostanie wygenerowany wyjątek.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. Może to być pożądane, dzięki czemu aplikacja może monituje użytkownika o upewnij się, że ten rekord nadal reprezentuje sama osoba rzeczywiste przed zapisaniem zmian.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.

Uwaga

Ta strona dokumenty, jak skonfigurować tokeny współbieżności.This page documents how to configure concurrency tokens. Zobacz Obsługa współbieżności przykłady tego, jak użyć optymistycznej współbieżności dla aplikacji.See Handling Concurrency for examples of how to use optimistic concurrency in your application.

Jak działa tokeny współbieżności w EFHow concurrency tokens work in EF

Magazyny danych można wymusić tokeny współbieżności, sprawdzając, czy każdy rekord jest zaktualizowane lub usunięte nadal ma taką samą wartość tokenu współbieżności, który został przypisany, gdy pierwotnie kontekstu ładowania danych z bazy danych.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.

Na przykład relacyjnych baz danych to osiągnąć przy wraz z tokenem współbieżności w WHERE klauzuli dowolnego UPDATE lub DELETE polecenia i sprawdzanie liczby wierszy, które miały wpływ.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. Jeśli token współbieżności nadal odpowiada jeden wiersz zostanie zaktualizowany.If the concurrency token still matches then one row will be updated. Jeśli wartość w bazie danych została zmieniona, żadne wiersze zostały zaktualizowane.If the value in the database has changed, then no rows are updated.

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

KonwencjeConventions

Według Konwencji właściwości nigdy nie są skonfigurowane jako tokeny współbieżności.By convention, properties are never configured as concurrency tokens.

Adnotacji danychData Annotations

Adnotacje danych służy do konfigurowania właściwości jako tokenem współbieżności.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; }
}

Interfejsu API FluentFluent API

Interfejsu API Fluent umożliwia skonfigurowanie właściwości jako tokenem współbieżności.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; }
}

Wersja wiersza/znacznik czasuTimestamp/row version

Sygnatura czasowa jest właściwością, gdzie nowa wartość jest generowany przez bazę danych, za każdym razem, gdy wiersz jest wstawiane lub aktualizowane.A timestamp is a property where a new value is generated by the database every time a row is inserted or updated. Właściwości są także traktowane jako tokenem współbieżności.The property is also treated as a concurrency token. Dzięki temu otrzymasz wyjątek, jeśli osobom został zmodyfikowany na wiersz, który próbujesz zaktualizować, ponieważ zapytanie dotyczące danych.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.

Jak jest to osiągane jest używany dostawca bazy danych.How this is achieved is up to the database provider being used. Dla programu SQL Server sygnatury czasowej jest zwykle używany w byte [] właściwość, która będzie można skonfigurować jako ROWVERSION kolumny w bazie danych.For SQL Server, timestamp is usually used on a byte[] property, which will be setup as a ROWVERSION column in the database.

KonwencjeConventions

Według Konwencji właściwości nigdy nie są skonfigurowane jako sygnatur czasowych.By convention, properties are never configured as timestamps.

Adnotacji danychData Annotations

Adnotacje danych służy do konfigurowania właściwości jako sygnaturę czasową.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; }
}

Interfejsu API FluentFluent API

Do skonfigurowania właściwości jako sygnaturę czasową, można użyć interfejsu API Fluent.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; }
}