Mysql
 sql >> Base de données >  >> RDS >> Mysql

Concurrence optimiste avec Entity Framework et MySQL

Grosse mise en garde :NON TESTÉ - juste penser à haute voix.

EF prend en charge le remplacement de SaveChanges , alors peut-être qu'une option consiste à définir une interface telle que :

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

et ajoutez un int RowVersion propriété/champ à la fois à votre ou vos classes de modèle et à la ou aux tables de base de données, et utilisez partial class pour implémenter cette interface (en utilisant l'implémentation d'interface implicite) :

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

Remplacez ensuite SaveChanges , quelque chose comme :

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);
}

qui devrait alors fonctionner (en théorie - non testé) comme un compteur de version de ligne implémenté manuellement. Laissez la validation des modifications activée pour RowVersion , et cela devrait servir.