Que fait exactement SaveChanges () dans EF6?

J'essaie de comprendre les transactions dans le cadre de l'entité 6 .. J'ai beaucoup cherché mais je suis toujours confus ..

Regarde ça:

Dim transaction = context.Database.BeginTransaction() Using transaction . . context.Entry(entity1).State = System.Data.EntityState.Added; SaveChanges() . . context.Entry(entity2).State = System.Data.EntityState.Added; SaveChanges() . . context.Entry(entity3).State = System.Data.EntityState.Added; SaveChanges() Transaction.Commit() 'Or Transaction.RollBack() End using 

Maintenant, que fait exactement SaveChanges() Do? et en quoi diffère-t-il de l'engagement?

Est-ce qu'il commence une nouvelle transaction (peut-être interne) pour chaque insertion et ensuite le commettre?

J'ai lu https://msdn.microsoft.com/en-us/data/dn456843.aspx .

C'est ce que j'ai compris de "Dans toutes les versions d'Entity Framework, chaque fois que vous exécutez SaveChanges() pour insert, mettre à jour ou supprimer sur la database, le framework encapsule cette opération dans une transaction. Lorsque vous exécutez une autre opération de ce type, une nouvelle transaction est démarrée. "

Ma compréhension est, tous les changements aux entités (en particulier là où il y a des relations qui ont des suppressions en cascade, ou, réinsert un élément qui a été supprimé) est de sortinger les opérations afin qu'ils soient effectués dans le bon ordre.

Par exemple, si vous avez une table avec une contrainte unique, et vous avez supprimé une entité avec une valeur unique sur la colonne avec la contrainte et réinséré une autre entité avec la même valeur, les opérations sont effectuées dans le bon ordre afin que le sous-jacent dmbs ne lance pas une exception de contrainte unique. Les keys primaires non incrémentées et autres sont utilisées, bien que, espérons-le, vous compreniez l'essentiel.

Les entités sont stockées dans un graphique avec les relations en tant qu'arêtes de sorte qu'il peut sortinger le graphique et effectuer les opérations dans le bon ordre.

Ceci est effectué par le ChangeTracker. Je sais cela de travailler avec / build mon propre traqueur d'entité en utilisant le code source de l'printingnant IQToolkit.

Je comprends aussi que cela se fasse en une seule transaction, si le dmbs sous-jacent le supporte …

De plus, dans votre exemple, vous n'avez qu'à appeler

 SaveChanges() 

Une fois pas après chaque fois que vous changez une entité.

Vous n'avez pas non plus besoin de créer une transaction explicite et de la valider, comme le fait SaveChanges en interne, sauf si vous devez annuler la transaction en raison d'un facteur externe.

MODIFIER

Pour répondre explicitement à vos questions en gras:

"Maintenant, que fait exactement SaveChanges () Do? Et en quoi diffère-t-il du commit?"

Il sortinge les commands sql générées par chaque modification apscope aux entités et les exécute, en une seule transaction, dans un ordre qui ne viole aucune relation ou configuration de contraintes de champ dans la database. Comme il utilise sa propre transaction, vous n'avez pas besoin d'encapsuler l'opération dans une nouvelle transaction et de la valider, sauf si vous avez une raison de revenir en arrière en raison d'un facteur externe.

Il diffère de Commit car Commit commet toutes les modifications effectuées lors d'une transaction, tandis que SaveChanges crée sa propre transaction autour des mises à jour et valide la transaction. Ce que vous faites est imbriquer la transaction créée par SaveChanges dans la transaction externe, de sorte que vous pouvez l'annuler si nécessaire.

"Est-ce qu'il commence une nouvelle transaction (peut-être interne) pour chaque insertion, puis la valider?"

Non, il les enveloppe tous et s'engage dans une transaction interne unique.