Mysql
 sql >> Database >  >> RDS >> Mysql

Concorrenza ottimistica con Entity Framework e MySQL

Grande avvertenza:NON TESTATO - solo pensando ad alta voce.

EF supporta l'override di SaveChanges , quindi forse un'opzione è definire un'interfaccia come:

interface IVersionedRow {
    int RowVersion {get;set;}
}

e aggiungi una int RowVersion proprietà/campo sia alle classi del modello che alle tabelle del database e utilizzare partial class per implementare questa interfaccia (usando l'implementazione dell'interfaccia implicita):

partial class Customer : IVersionedRow {}
partial class Order : IVersionedRow {}
...

Quindi sovrascrivi SaveChanges , qualcosa come:

public override int SaveChanges(SaveOptions options)
{    
    foreach (ObjectStateEntry entry in
        ObjectStateManager.GetObjectStateEntries(EntityState.Modified))
    {
        var v = entry.Entity as IVersionedRow;
        if(v != null) v.RowVersion++;
    }
    return base.SaveChanges(options);
}

che dovrebbe quindi funzionare (in teoria - non testato) come contatore di versioni di riga implementato manualmente. Lascia la convalida delle modifiche abilitata per RowVersion , e questo dovrebbe servire.