Comment exécuter deux contextes Entity Framework dans TransactionScope sans MSDTC?

entity-framework msdtc transactions

Question

Ce problème n'est pas facilement reproductible dans un exemple simple ici, mais je me demandais si quelqu'un avait une expérience et des conseils, voici le problème:

  • en utilisant Entity Framework
  • avoir de nombreux points d'application où (1) les données sont écrites dans une table d' entités , par exemple le client, (2) les données sont écrites dans la table d' historique
  • Ces deux actions utilisent Entity Framework, cependant, elles utilisent des contextes différents
  • ces actions doivent être à la fois dans une transaction : par exemple, si l'une n'écrit pas, l'autre ne doit pas écrire, etc.
  • Je peux les envelopper avec un TransactionScope,

comme ça:

using (TransactionScope txScope = new TransactionScope()) {
    ...
}

mais cela me donne:

MSDTC (Microsoft Distributed Transaction Coordinator) est désactivé pour les transactions réseau.

Notre administrateur de base de données m'a dit que MSDTC est désactivé par choix et ne peut pas être installé .

Par conséquent, j'apporte des modifications en essayant de créer ma propre EntityConnection avec un MetadataWorkspace avec l'idée que chaque contexte utilisera la même EntityConnection . Cependant, cela s'avère presque impossible d'essayer de le faire fonctionner, par exemple, je continue à obtenir l'erreur ci-dessus même si, théoriquement, les deux contextes utilisent EntityConnection. Il est difficile de comprendre où / pourquoi Entity Framework requiert le MSDTC par exemple.

Quelqu'un at-il déjà emprunté cette voie, avez-vous une expérience ou des exemples de code à partager?

Réponse acceptée

Eh bien, le problème est assez facile.

Si vous utilisez SQL Server 2008, vous ne devriez pas avoir ce problème car vous avez une transaction promotible, et comme .NET sait que vous utilisez le même magasin de persistance (la base de données), il ne sera pas promu en DTC et ne le validera pas comme local. étudiez une transaction promotionnelle avec SQL Server 2008.

Autant que je sache, Oracle travaille dans son pilote pour prendre en charge les transactions pouvant faire l'objet d'une promotion, mais je ne connais pas l'état, le pilote MS Oracle ne le prend pas en charge. http://www.oracle.com/technology/tech/windows/odpnet/col/odp.net_11.1.0.7.20_twp.pdf

Si vous utilisez un pilote qui ne prend pas en charge les transactions pouvant être promues, il est impossible pour .NET d'utiliser une transaction locale pour effectuer deux connexions. Vous devez modifier votre architecture ou convaincre l’administrateur de la base de données d’installer MSDTC.


Réponse populaire

Je pense que ce que vous devez faire est de forcer vos contextes à partager une connexion à une base de données unique. Vous pourrez ensuite effectuer ces deux opérations dans deux contextes différents en une seule transaction. Vous pouvez y parvenir en transmettant un objet EntityConnection aux deux constructeurs de votre contexte. Bien entendu, cette approche nécessitera que vous passiez cet objet aux méthodes qui mettent à jour la base de données.

J'ai récemment blogué sur la création d'une portée de contexte de base de données, ce qui faciliterait l'utilisation de plusieurs contextes et transactions EF.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow