1

Lors de la création d'un utilisateur, des entrées sont requises dans plusieurs tables. J'essaye de créer une transaction qui crée une nouvelle entrée dans une table et puis passe le nouvel entityid dans la table parent et ainsi de suite. L'erreur que j'obtiens estTransaction WCF avec plusieurs insertions

Le gestionnaire de transactions a désactivé sa prise en charge pour les transactions à distance/réseau. (Exception de HRESULT: 0x8004D024)

Je crois que cela est dû à la création de plusieurs connexions dans un seul TransactionScope, mais je ne suis pas sûr de ce que le meilleur/moyen le plus efficace de le faire est.

[OperationBehavior(TransactionScopeRequired = true)] 
    public int CreateUser(CreateUserData createData) 
    { 

     // Create a new family group and get the ID 
     var familyGroupId = createData.FamilyGroupId ?? CreateFamilyGroup(); 

     // Create the APUser and get the Id 
     var apUserId = CreateAPUser(createData.UserId, familyGroupId); 

     // Create the institution user and get the Id 
     var institutionUserId = CreateInsUser(apUserId, createData.AlternateId, createData.InstitutionId); 

     // Create the investigator group user and return the Id 
     return AddUserToGroup(createData.InvestigatorGroupId, institutionUserId); 

    } 

Voici un exemple de l'un des appels de fonction, tous les autres suivent le même format

public int CreateFamilyGroup(string familyGroupName) 
    { 
     var familyRepo = _FamilyRepo ?? new FamilyGroupRepository(); 
     var familyGroup = new FamilyGroup() {CreationDate = DateTime.Now}; 

     return familyRepo.AddFamilyGroup(familyGroup); 

    } 

Et l'appel du référentiel pour cela est la suivante

public int AddFamilyGroup(FamilyGroup familyGroup) 
     { 
      using (var context = new GameDbContext()) 
      { 
       var newGroup = context.FamilyGroups.Add(familyGroup); 
       context.SaveChanges(); 
       return newGroup.FamilyGroupId; 
      } 
     } 

Répondre

1

Je crois que cela est causé par la création de plusieurs connexions au sein d'un seul TransactionScope

Oui, c'est le problème. Peu importe comment vous évitez cela tant que vous l'évitez. Une chose courante à faire est d'avoir une connexion et un contexte EF par requête WCF. Vous devez trouver un moyen de transmettre ce contexte EF.

La méthode AddFamilyGroup illustre un anti-pattern commun avec EF: Vous utilisez EF comme une installation CRUD. Il est censé me ressembler plus à un graphe d'objets en direct connecté à la base de données. La requête WCF entière doit partager le même contexte EF. Si vous vous déplacez dans cette direction, le problème disparaît.

+0

Merci. J'ai été capable de tout faire dans un contexte et tout fonctionne maintenant. –