Quel est le lien entre la transaction en arrière et LINQ vers SQL?

La question concerne uniquement l’annulation des modifications, pas l’engagement.

Supposons que je récupère des données, que je les modifie, que je soumette des modifications (étape facultative) et que j’annule une transaction. Où que vous regardiez chaque auteur écrit, cela annule les modifications.

Mais j’ai découvert que c’était à moitié vrai – LINQ DataContext conservera les données modifiées! J’ai testé cela en utilisant TransactionScope et DataContext.Transaction. Dans les deux cas, j’ai eu le même comportement.

Une solution de contournement consisterait à recréer DataContext après la restauration (toutefois, d’autres problèmes tels que la mise en cache des données et la gestion des transactions nestedes) ou l’annulation manuelle des modifications dans DataContext. Néanmoins, ce ne sont que des solutions de contournement.

Des questions

Alors qu’est-ce qui me manque? LINQ to SQL ne convient-il pas aux transactions? Comment utiliser les transactions pour qu’elles annulent VRAIMENT les modifications?

Exemple

MyTable record = null; db.Connection.Open(); using (db.Transaction = db.Connection.BeginTransaction()) { record = db.MyTable.First(); record.BoolField = !record.BoolField; // changed db.SubmitChanges(); db.Transaction.Rollback(); } 

Un contexte de données doit être considéré comme une unité de travail. À vous de décider en détail, cela peut être une demande de page ou une opération unique; mais – si vous obtenez une exception (ou à peu près quelque chose d’inattendu) – arrêtez ; abandonner le contexte de données et la restauration. Après une restauration, votre contexte de données sera confus, alors ne le gardez pas .

Aditionellement; ne gardez pas un contexte de données plus longtemps que nécessaire. Il ne s’agit pas d’un cache de données long d’une application.

Ce que vous semblez demander, c’est un cache en mémoire de la firebase database (ou une partie de celle-ci) plutôt qu’un ORM léger. Je dirais que LINQ to SQL convient parfaitement aux transactions et qu’il s’agit d’un ORM léger, mais que son utilisation en tant que cache de firebase database n’est pas très utile. À mon avis, le contexte de données fonctionne mieux à l’aide du modèle d’unité de travail. Créez le contexte pour une tâche particulière, effectuez la tâche, puis supprimez le contexte. Si la tâche inclut une transaction ayant échoué, vous devez déterminer comment réagir à l’échec. Cela peut être soit en corrigeant les erreurs et en essayant à nouveau avec le contexte existant, soit, comme dans un contexte Web, en renvoyant les modifications tentées à l’utilisateur, puis en essayant à nouveau avec un nouveau contexte lorsque les données sont resoumises.

Deux choses:

1) contexte de données obsolète

Ce que vous observez est communément appelé un contexte de données “obsolète”. Les entités du contexte de données ne remarquent pas votre rollbak. Vous obtiendrez un comportement similaire si vous exécutiez une procédure stockée après vos modifications de soumission. Cela ne sera pas non plus remarqué par le contexte de données. Cependant, vos transactions seront annulées dans la firebase database! (et de même la procédure stockée sera exécutée)

2) sur les transactions

Il n’y a pas besoin de gérer la transaction. Linq2Sql crée déjà une transaction pour vous dans les Submitchanges. Si vous voulez vraiment gérer les transactions (par exemple sur plusieurs datacontexts ou une procédure stockée combinée à un linq2sql, encapsulez le tout dans un TransactionScope. Appelez transaction.Complete () au moment où vous voulez valider.