Il modo migliore per gestire la concorrenza ottimistica con Entity Framework 7

asp.net-core entity-framework-core

Domanda

Sto usando ASP.NET 5 rc1 e Entity 7 rc1 su coreclr con un progetto di prima migrazione del codice di esempio.

Stavo controllando come gestire la concorrenza nelle entità ma non sono riuscito a trovare alcuna informazione aggiornata sulle pratiche di gestione della concorrenza consigliate per Entity 7.

Ho alcune entità, tutte implementano l'interfaccia:

public interface IVersionedModel
{
    byte [] RowVersion { get; set; }
}

come per esempio in:

public interface IVersionedModel
{
    byte [] RowVersion { get; set; }
}

Invece di aggiungere l'attributo [Timestamp] a ciascuna colonna RowVersion, preferisco usare la fluente configurazione, quindi nel mio DbContext specificherò per ciascuna entità che voglio che quella colonna sia gestita come la versione della riga.

Tuttavia, Entity 7 non sembra più supportare l'opzione .IsRowVersion() ma ha l'opzione IsConcurrencyToken() , che dovrebbe essere sufficiente ma nelle prime migrazioni di codice genera una colonna varbinary nullable e quando inserisce / aggiorna le righe non incrementa automaticamente .

Mi chiedo se la cosa migliore da fare sia gestire esplicitamente la versione di ogni riga aumentando la versione durante l'aggiornamento o l'inserimento di entità nel database. Questo è il mio DbContext

public interface IVersionedModel
{
    byte [] RowVersion { get; set; }
}

Fondamentalmente la mia domanda è, come gestire la concorrenza con ASP.NET 5 e Entity 7? È la prima volta che mi occupo di questa cosa e ogni suggerimento sarà apprezzato.

AGGIORNAMENTO : grazie al link https://stackoverflow.com/users/1922568/joe-audette fornito ho trovato alcune risposte, purtroppo non tutte

Come per http://docs.efproject.net/en/latest/modeling/concurrency.html#how-concurrency-tokens-work-in-ef , sembra che possiamo usare l'annotazione Timestamp se vogliamo fare una versione di una riga o l'annotazione ConcurrencyCheck su una proprietà se vogliamo una versione basata su una proprietà (non sull'intera riga).

L'API fluente consente solo di configurare token di concorrenza usando .IsConcurrencyToken()

Non ho ancora trovato una via attraverso l'API fluente per la versione dell'intera riga con una colonna dedicata (sarebbe bello se l'API fluente consentisse una .IsRowVersion() , ma non lo fosse)

Risposta popolare

Ho creato una classe statica per gestire questa e altre funzionalità mancanti di EF7 ModelBuilder ( usare con cautela , non testato in un ambiente di produzione)

public static class SqlServerModelBuilderExtensions
{
    public static PropertyBuilder<decimal?> HasPrecision(this PropertyBuilder<decimal?> builder, int precision, int scale)
    {
        return builder.HasColumnType($"decimal({precision},{scale})");
    }

    public static PropertyBuilder<decimal> HasPrecision(this PropertyBuilder<decimal> builder, int precision, int scale)
    {
        return builder.HasColumnType($"decimal({precision},{scale})");
    }

    public static PropertyBuilder<byte[]> IsRowVersion(this PropertyBuilder<byte[]> builder)
    {
        return builder.HasColumnType("rowversion").IsConcurrencyToken().ValueGeneratedOnAdd();
    }
}



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché