Question

J'ai une table qui a un index unique sur une table avec une colonne ordinal. Ainsi, par exemple la table aura les colonnes suivantes:

tableid, ID1, ID2, ordinal

L'index unique est à travers les colonnes ID1, ID2, ordinal.

Le problème que j'ai est que lors de la suppression d'un enregistrement de la base de données que je resequence alors les ordinaux afin qu'ils soient à nouveau séquentiel. Ma fonction de suppression ressemblera à ceci:

    public void Delete(int id)
    {
        var tableObject = Context.TableObject.Find(id);
        Context.TableObject.Remove(tableObject);
        ResequenceOrdinalsAfterDelete(tableObject);
    }

Le problème est que quand je l'appelle (Context.SaveChanges), il casse l'index unique car il semble exécuter les instructions dans un ordre différent de celui qu'ils ont été adoptés. Par exemple, les événements suivants se produisent:

  1. resequence les ordinaux
  2. Supprimer l'enregistrement

Au lieu de:

  1. Supprimer l'enregistrement
  2. resequence les ordinaux

Est-ce le bon comportement de EF? Et si elle est, est-il un moyen de passer outre ce comportement pour forcer l'ordre d'exécution?

Si je ne l'ai pas expliqué cela correctement, s'il vous plaît laissez-moi savoir ...

Était-ce utile?

La solution

Ordre des commandes est complètement sous le contrôle de EF. La seule façon que vous pouvez modifier l'ordre utilise SaveChanges séparés pour chaque opération:

public void Delete(int id)
{
    var tableObject = Context.TableObject.Find(id);
    Context.TableObject.Remove(tableObject);
    Context.SaveChanges();
    ResequenceOrdinalsAfterDelete(tableObject);
    Context.SaveChanges();
}

Vous devez également exécuter ce code dans la transaction créé manuellement pour assurer atomicité (=> TransactionScope).

Mais la meilleure solution serait probablement en utilisant la procédure stockée parce que votre resequencing doivent tirer tous les dossiers concernés de la base de données à votre application, changer ordinale et enregistrer les ramener à la base de données un par un.

BTW. faisant cela sent avec la base de données. Quel est le problème d'avoir une lacune dans la séquence « ordinal »?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top