2011-10-16 5 views
1

Disons que j'ai l'entité A, qui a de nombreuses relations avec d'autres entités de type A. Donc, sur l'entité A, j'ai la collection de A. Et disons que je dois "mettre à jour" "Ces relations selon un service externe - de temps en temps je reçois notification que les relations pour certaines entités ont changé, et tableau d'ID des entités connexes actuelles - certaines relations peuvent être nouvelles, certaines existantes, certaines d'exister plus là .. Comment puis-je mettre à jour efficacement ma base de données avec EF? Quelques idées:Comment rafraîchir efficacement une relation plusieurs à plusieurs

  1. entité charge désireux avec ses entités apparentées, ne foreach sur la collecte des ID de service externe, et supprimer/ajouter au besoin. Mais ce n'est pas très efficace - besoin de charger éventuellement des centaines d'entités connexes

  2. effacer les relations actuelles et insérer de nouvelles. Mais comment ? Peut-être effectuer par supprimer la procédure stockée, puis insérez par « faux » objets

    a.Related.Add(new A { Id = idFromArray }) 
    

mais cela peut être fait dans la transaction? (appel à la procédure stockée, puis inserts effectués par SaveChanges)

ou y a-t-il une 3ème voie?

Thanx.

Répondre

0

Ok, solution trouvée. Bien sûr, la solution EF pure est la première proposée dans la question originale.

Mais, si les performances sont importantes, il existe une troisième méthode, la meilleure, bien que spécifique au serveur SQL (afaik) - une procédure avec le paramètre table. Tous les nouveaux ID associés entrent et la procédure stockée effectue une suppression et des insertions dans la transaction.

Rechercher les exemples et la comparaison des performances ici (excellent article, je fonde ma solution là-dessus):

http://www.sommarskog.se/arrays-in-sql-2008.html

0

Eh bien, « de temps en temps » ne ressemble pas à une situation de penser beaucoup sur l'amélioration des performances (sauf si vous voulez dire « de milliseconde à la milliseconde ») :)

Quoi qu'il en soit, la première approche est l'idée correcte faire cette mise à jour sans procédure stockée. Et oui, vous devez charger toutes les anciennes entités liées, car la mise à jour d'une relation plusieurs-à-plusieurs ne fonctionne que si les EF modifient la détection. Aucune clé étrangère exposée ne peut être utilisée pour mettre à jour les relations sans avoir chargé les propriétés de navigation.

Un exemple comment cela pourrait examiner en détail est ici (nouvelle question d'hier):

Selecting & Updating Many-To-Many in Entity Framework 4

(Seul le dernier extrait de code avant la section « Edition » est pertinente à votre question et Edit . article lui-même)

Pour votre deuxième solution, vous pouvez envelopper toute l'opération dans une transaction créée manuellement:

using (var scope = new TransactionScope()) 
{ 
    using (var context = new MyContext()) 
    { 
     // ... Call Stored Procedure to delete relationships in link table 

     // ... Insert fake objects for new relationships 

     context.SaveChanges(); 
    } 
    scope.Complete(); 
} 
Questions connexes