2016-04-21 14 views
0

Ich versuche, einen Eintrag in eine Tabelle hinzuzufügen und den Primärschlüssel des hinzugefügten Eintrags zu verwenden, um einen zusätzlichen Eintrag in einer anderen Tabelle zu erstellen.Einfügen in mehrere Tabellen mit WCF-Transaktionen

Der Fehler, den ich bekommen habe ist

Der Transaktionsmanager hat seine Unterstützung für die Fern/Netzwerk Transaktionen deaktiviert. (Ausnahme von HRESULT: 0x8004D024)

Ich glaube, dies durch die Schaffung mehrerer Verbindungen innerhalb einer einzelnen Transaction verursacht wird, aber ich tue alles in einem Kontext/Anweisung, so dass ich glaube nicht, dass ich diese Aufnahme werden soll Error.

Dienst

[OperationBehavior(TransactionScopeRequired = true)] 
    public void CreateGroup(NewGroupData data) 
    { 
     var groupRepo = _GroupRepo ?? new InvestigatorGroupRepository(); 
     groupRepo.CreateGroup(data.UserId, data.InvestigatorGroupName, data.HasGameAssignment, data.InstitutionId); 

    } 

Repository

public void CreateGroup(string userId, string investigatorGroupName, bool hasGameAssignment, int institutionId) 
    { 
     using (var context = new GameDbContext()) 
     { 
      var newGroup = new InvestigatorGroup() 
      { 
       InvestigatorGroupName = investigatorGroupName, 
       HasGameAssignment = hasGameAssignment, 
       InstitutionId = institutionId, 
       IsTrashed = false 
      }; 

      int institutionUserId = 
       context.InstitutionUsers.Where(
        iu => !iu.IsTrashed && iu.APUser.UserId == userId && iu.InstitutionId == institutionId).Select(iu => iu.InstitutionUserId).Single(); 

      var newGroupUser = new InvestigatorGroupUser() 
      { 
       InstitutionUserId = institutionUserId, 
       InvestigatorGroup = newGroup, 
       CreationDate = DateTime.Now 
      }; 
      context.InvestigatorGroupUsers.Add(newGroupUser); 

      context.SaveChanges(); 
     } 
    } 

Antwort

1

Sie mit einer falschen Annahme aus.

Die Linie ...

int newGroupId = context.InvestigatorGroups.Add(newGroup).InvestigatorGroupId; 

... immer 0-newGroupId zuweisen. Die Methode Add markiert nur die Entität für die Einfügung, fügt sie aber nicht tatsächlich ein. Nur SaveChanges schreibt Daten in die Datenbank, keine andere Methode in Entity Framework.

So ist die Zuordnung ...

InvestigatorGroupId = newGroupId, 

... ist auch fehlerhaft. Sie haben die neuen InvestigatorGroup auf eine Navigationseigenschaft in InvestigatorGroupUser zuweisen:

InvestigatorGroup = newGroup, 

Diese Navigationseigenschaft zu InvestigatorGroupUser, wenn Sie es noch nicht bekommen haben.

Falls Sie Fragen haben, dann ist es genug, um diese Zeilen auszuführen:

context.InvestigatorGroupUsers.Add(newGroupUser); 
context.SaveChanges(); 

Keine Notwendigkeit, Add das newGroup Objekt zu, wird es von hinzugefügt werden newGroupUser hinzufügen.

Wenn Sie das tun, ist die einzige Transaktion, die Sie benötigen, diejenige, die SaveChanges intern standardmäßig verwendet. Für den Code, den Sie anzeigen, benötigen Sie keine TransactionScope. Wenn dies Teil einer größeren WCF-Transaktion ist, könnte die Geschichte anders aussehen, aber ich denke, zumindest brauchten Sie einige Missverständnisse, die geklärt werden mussten.

+0

Danke für den Hinweis! Ich habe die Änderungen vorgenommen, die Sie gesagt haben, aber ich bekomme immer noch den gleichen Fehler (siehe meine aktualisierte Frage). Ich habe den transactionscope behalten, weil, wenn die Einfügung zu InvestigatorGroupUser ausfällt, ich die Einfügung in InvestigatorGroup ebenso scheitern lassen möchte –

+0

Der Punkt ist, dass Sie das TransactionScope nicht benötigen. 'SaveChanges' tut * alles fügt * in einer einzigen Transaktion ein, die es startet und festlegt. –

+1

Während @GertArnold korrekt ist und die Transaktion in diesem Fall unnötig ist, glaube ich http: // stackoverflow.com/questions/10130767/Die Transaktion-Manager-hat-deaktiviert-seine-Unterstützung-für-Remote-Netzwerk-Transaktionen wird erläutert, wie Sie diesen Fehler beheben, wenn Sie es in einem Kontext, wo dies erforderlich ist. – dman2306

Verwandte Themen