2

Ich habe die folgenden Fehler Ausführung dieses Stückes Code, eine verteilte Transaktion mit Entiy Framework beginnen:kann nicht

private bool _updateList(SysInfo _sysInfo, List<pList> _pList) 
{ 
    try 
    { 

     foreach (var p in _pList) 
     { 
      _context.spUpdatePListApprovalFlow(p.countryID, _sysInfo.User.JobRoleID, p.src, p.id, p.status, _sysInfo.User.Username); 
     } 

     return true; 
    } 
    catch (Exception ex) //debug only 
    { 
     throw; //throws error to the main try catch 
    } 
} 

ERROR

Der Betrieb nicht, da OLE DB durchgeführt werden kann Der Provider "MSDASQL" für den Verbindungsserver "AS400_LINKEDSRV" konnte keine verteilte Transaktion starten.

jedoch alles funktioniert gut, wenn ich die gespeicherte Prozedur in SQL Management Studio:

exec [dbo].[spUpdatePListApprovalFlow] 
     @CountryID = 123456, 
     @UserTypeID = 23456, 
     @Src = 1, 
     @Id = '123456789', 
     @Status = 30, 
     @Username = 'username' 

Ich bin müde nach einer Antwort von Graben nichts funktioniert ... Ein paar Dinge, die ich versucht habe:

  • SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
  • Einsatz mehrere Transaktionen in der gespeicherten Prozedur

Dieser SP hat 2 unterlagerte Prozeduren. Eine, die in eine Tabelle der Anwendungsdatenbank schreibt, und eine, die eine Tabelle in as400 aktualisiert.

Antwort

0

Wenn Sie nicht verteilte Transaktionen benötigen, können Sie versuchen, sie in den Einstellungen des verknüpften Server zu deaktivieren:

EXEC master.dbo.sp_serveroption 
    @server=N'AS400_LINKEDSRV', 
    @optname=N'remote proc transaction promotion', 
    @optvalue=N'false' 
+0

Ich bin nicht DBA, ich habe Admin-Berechtigungen in meiner DB nur. Wird dies jedoch das Problem lösen? Können Sie mir bitte erklären, was das bedeutet, wenn Sie das ausschalten? Wenn nötig, kann ich sie bitten, dies zu tun. – bmvr

+0

Dies ändert die Einstellungen des Verbindungsservers 'AS400_LINKEDSRV' in Ihrer SQL Server-Instanz. Es berührt nicht den entfernten AS400-Server. –

+1

Wenn verteilte Transaktionen aktiviert sind, wenn alles konfiguriert und funktionsfähig ist, erstreckt sich die Transaktion über beide Server hinweg, als wäre es ein einzelner Server. Wenn die Transaktion nicht verteilt wird, ist Ihr SQL Server dafür verantwortlich, nur lokale Änderungen in eine Transaktion zu übernehmen, und der entfernte Server ist für seine eigenen Änderungen verantwortlich. Es ist möglich, dass Änderungen an einem Server beibehalten werden und sich nicht auf einem anderen Server ändern. Ob dies in Ihrem Fall akzeptabel ist, hängt davon ab, was Ihre gespeicherten Prozeduren tun. –

0

Siehe diesem Microsoft page on Linked Servers.

Ihr Systemadministrator und/oder DBA muss wahrscheinlich Änderungen vornehmen, um die fehlende Verbindungsserverdefinition an Ihren AS/400-Server zu adressieren.

Ein anderes mögliches Problem ist, dass der AS/400-Server (von IBM) Softwareunterstützung für die OLE DB-Datenquellen nicht enthält. Dies ist auch etwas, das die Mitarbeiter der Systemadministration ansprechen müssen.

1

Ok, nachdem ich einen halben Tag versucht habe, das zu lösen, habe ich es endlich gelöst.

Auflösung

Downgraded von Entity Framework 6 Entity Framework 5 und die distribuited Transaktionen Fehler ist verschwunden.

Gerade achten, wenn Sie dies tun werden, müssen Sie einige usings in Ihrem Code ändern.(In automatisch generierten Code in das Datenmodell als auch)

EF 6 verwendet

using System.Data.Entity.Core.Objects 

EF 5 verwendet

using System.Data.Objects; 
+1

Nachdem Sie nun bestätigt haben, dass sich eine andere Version von EF anders verhält, können Sie eine weitere sehr gute Frage zu EF stellen und die Ursache des Problems finden. –

+0

Gute Idee, thx. – bmvr

2

In EF6 gespeicherten Prozeduren aufgerufen werden in einer expliziten Transaktion , standardmäßig. Sie können dies für eine bestimmte DbContext-Instanz deaktivieren, indem Sie die Konfiguration nach dem Erstellen oder für alle Instanzen eines DbContext-Typs ändern, indem Sie sie im Konstruktor ändern. EG

using (var db = new Db()) 
    { 
     db.Configuration.EnsureTransactionsForFunctionsAndCommands = false; 
     //. . . 
    } 

See: https://msdn.microsoft.com/en-us/library/system.data.entity.infrastructure.dbcontextconfiguration.ensuretransactionsforfunctionsandcommands