Warum funktioniert TransactionScope nicht mit Entity Framework?

.net c# entity-framework transactions transactionscope

Frage

Siehe den Code unten. Wenn ich mehr als einen Entitätskontext initialisiere, erhalte ich die folgende Ausnahme nur für den zweiten Satz von Code . Wenn ich das zweite Set auskommentiere, funktioniert es.

{"Der zugrunde liegende Anbieter ist beim Öffnen fehlgeschlagen."}

Inner: {"Die Kommunikation mit dem zugrunde liegenden Transaktionsmanager ist fehlgeschlagen."}

Inner: {"Fehler HRESULT E_FAIL wurde von einem Aufruf an eine COM-Komponente zurückgegeben."}

Beachten Sie, dass dies eine Beispiel-App ist und ich weiß, dass es nicht sinnvoll ist, zwei Kontexte hintereinander zu erstellen. Der Produktionscode hat jedoch Grund, mehrere Kontexte in demselben TransactionScope zu erstellen. Dies kann nicht geändert werden.

Bearbeiten

Hier ist eine vorherige Frage von mir beim Versuch, MS-DTC einzurichten. Es scheint sowohl auf dem Server als auch auf dem Client aktiviert zu sein. Ich bin nicht sicher, ob es richtig eingerichtet ist. Beachten Sie auch, dass einer der Gründe, warum ich dies versuche, darin besteht, dass der vorhandene Code im TransactionScope ADO.NET und Linq 2 Sql verwendet ... Ich möchte, dass diese auch dieselbe Transaktion verwenden. (Das hört sich wahrscheinlich verrückt an, aber ich muss es funktionieren lassen, wenn möglich).

Wie verwende ich TransactionScope in C #?

Lösung

Die Windows-Firewall blockierte die Verbindungen zu 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();
        }

Akzeptierte Antwort

Ihr MS-DTC (Distributed Transaction Coordinator) funktioniert aus irgendeinem Grund nicht ordnungsgemäß. MS-DTC wird verwendet, um die Ergebnisse von Transaktionen über mehrere heterogene Ressourcen hinweg zu koordinieren, einschließlich mehrerer SQL-Verbindungen.

Schauen Sie sich diesen Link an, um weitere Informationen zu erhalten.

Wenn Sie sicherstellen, dass Ihr MS-DTC ausgeführt wird und ordnungsgemäß funktioniert, sollten Sie grundsätzlich keine Probleme mit der Verwendung von 2 ADO.NET-Verbindungen haben - unabhängig davon, ob es sich um Entity-Framework-Verbindungen oder einen anderen Typ handelt.


Beliebte Antwort

Sie können die Verwendung einer verteilten Transaktion vermeiden, indem Sie Ihre eigene EntityConnection verwalten und diese EntityConnection an Ihren ObjectContext übergeben. Ansonsten schauen Sie sich diese an.

http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=580828&SiteID=1&mode=1 http://forums.microsoft.com/msdn/showpost.aspx?postid=113669&siteid=1&sb=0&d=1&at=7&ft = 11 & tf = 0 & pageid = 1

EntityConnection conn = new EntityConnection(ConnectionString);

using (TransactionScope ts = new TransactionScope())
{
    using (DatabaseEntityModel o = new DatabaseEntityModel(conn))
    {
            var v = (from s in o.Advertiser select s).First();
            v.AcceptableLength = 1;
    }

    //-> By commenting out this section, it works
    using (DatabaseEntityModel o = new DatabaseEntityModel(conn))
    {
        //Exception on this next line
        var v = (from s1 in o.Advertiser select s1).First();
                v.AcceptableLength = 1;
    }
    //->

    ts.Complete();
}


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum