2017-10-20 7 views
2

Dans un projet aspi net core + ef core 2.0 web api j'utilise une méthode put définie comme ci-dessous dans laquelle je dois mettre à jour chaque propriété de mes entités un:Entity Framework Core 2: Mise à jour facile d'un objet et de ses relations

public async Task<IActionResult> PutCIApplication([FromRoute] Guid id, [FromBody] CIApplication cIApplication) 
    { 
     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 

     if (id != cIApplication.ID) 
     { 
      return BadRequest(); 
     } 

     string userLang = HttpContext.Request.Headers["UserCulture"].ToString(); 
     var dbCIApplication = await _context.CIApplications.Include(c => c.Translations).Include(c => c.DeploymentScenarios).SingleOrDefaultAsync(m => m.ID == id); 

     if (dbCIApplication == null) 
     { 
      return NotFound(); 
     } 

     //Name and Desc are localized properties, they are stored in a collection of Translation with one to many relationship 
     dbCIApplication.Translations[userLang].Name = cIApplication.Name; 
     dbCIApplication.Translations[userLang].Description = cIApplication.Description; 
     dbCIApplication.UpdatedBy = cIApplication.UpdatedBy; 
     dbCIApplication.Status = cIApplication.Status; 
     dbCIApplication.Publisher = cIApplication.Publisher; 
     // And the list goes on... 
     //... and on... 

     _context.CIApplications.Update(dbCIApplication); 

     try 
     { 
      await _context.SaveChangesAsync(); 
     } 
     catch (DbUpdateConcurrencyException) 
     { 
      if (!CIApplicationExists(id)) 
      { 
       return NotFound(); 
      } 
      else 
      { 
       throw; 
      } 
     } 

     return NoContent(); 
    } 

Il fonctionne très bien, donc je ne vraiment pas un problème, mais je me demandais s'il y a un moyen d'éviter la partie où je copie chaque propriété, un par un.

J'ai essayé avec automapper mais comme il crée une nouvelle instance, je reçois une erreur "impossible à suivre car une autre instance de ce type avec la même clé est déjà en cours de suivi".

J'aurais aimé utiliser du code réutilisable dans lequel je pourrais passer mon objet à mettre à jour et une liste de propriétés à ignorer. Mais je ne suis pas assez bon codeur pour le mettre en place, si quelqu'un avait une idée géniale ce serait génial!

Merci!

Répondre

0

C'est le point où vous devriez probablement commencer à repenser votre conception, mais néanmoins vous pouvez en fait nous AutoMapper et désactiver le suivi.

Vérifiez ce lien: https://docs.microsoft.com/en-us/ef/core/querying/tracking

var dbCIApplication = await _context 
       .CIApplications 
       .AsNoTracking() 
       .Include(c => c.Translations) 
       .Include(c => c.DeploymentScenarios) 
       .SingleOrDefaultAsync(m => m.ID == id); 
+0

Merci pour votre réponse. C'est actuellement mon "v2" de cette application et je suis actuellement en train d'essayer de renouveler mon desing et le thech impliqué (passer de asp.net // ef 6 à asp.net core et ef core 2). Pourriez-vous me dire ce que vous aviez en tête quand vous dites que je devrais repenser mon design? Comme je ne suis pas du tout un développeur, je suis en train d'essayer de coder en utilisant Google copier-coller et beaucoup de café :) –