Voir le code ci-dessous. Si j'initialise plus d'un contexte d'entité, alors je reçois l'exception suivante sur le 2ème jeu de code seulement. Si je commente le deuxième set cela fonctionne.Pourquoi TransactionScope ne fonctionne pas avec Entity Framework?
{ "Le fournisseur sous-jacent a échoué sur Ouvrir."}
intérieur: { "Communication avec le gestionnaire de transaction sous-jacente a échoué."}
intérieur: { "Erreur HRESULT E_FAIL a été renvoyé d'un appel à un composant COM. "}
Notez qu'il s'agit d'un exemple d'application et je sais que cela n'a pas de sens de créer deux contextes à la suite. Cependant, le code de production a des raisons de créer plusieurs contextes dans le même TransactionScope
, et cela ne peut pas être changé.
Modifier
Voici une précédente question de moi d'essayer de mettre en place MS-DTC. Il semble être activé sur le serveur et le client. Je ne suis pas sûr si elle est configurée correctement. Notez également que l'une des raisons pour lesquelles j'essaye de faire ceci, est que le code existant dans le TransactionScope
emploie ADO.NET et Linq 2 Sql ... Je voudrais que ceux-ci emploient la même transaction aussi. (Cela semble probablement fou, mais je dois le faire fonctionner si possible).
How do I use TransactionScope in C#?
Solution
Pare-feu Windows bloque les connexions a été à MS-DTC.
using(TransactionScope ts = new System.Transactions.TransactionScope())
{
using (DatabaseEntityModel o = new DatabaseEntityModel())
{
var v = (from s in o.Advertiser select s).First();
v.AcceptableLength = 1;
o.SaveChanges();
}
//-> By commenting out this section, it works
using (DatabaseEntityModel o = new DatabaseEntityModel())
{
//Exception on this next line
var v = (from s1 in o.Advertiser select s1).First(); v.AcceptableLength = 1;
o.SaveChanges();
}
//->
ts.Complete();
}
Cela fonctionne maintenant. Le pare-feu Windows bloquait les connexions à MS-DTC. – NotDan