2017-10-20 5 views
2

In einem ASP Net Core + ef Kern 2.0 Web API-Projekt verwende ich eine Put-Methode wie unten definiert, in dem ich jede Eigenschaften meiner Entitäten eine aktualisieren müssen ein:Entity Framework Core 2: Leicht zu aktualisieren ein Objekt und seine Beziehungen

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(); 
    } 

Es funktioniert sehr gut, so dass ich nicht wirklich ein Problem, aber ich habe mich gefragt, ob es einen Weg, um das Teil zu vermeiden, in denen ich jede Eigenschaft eines nach dem anderem zu kopieren.

Ich versuchte mit Autoadapter, aber wie es eine neue Instanz erstellt bekomme ich einen Fehler "kann nicht verfolgt werden, weil eine andere Instanz dieses Typs mit dem gleichen Schlüssel bereits verfolgt wird" -Fehler.

Ich hätte gerne wiederverwendbaren Code verwendet, in dem ich mein Objekt übergeben konnte, um es zu aktualisieren, und eine Liste von zu ignorierenden Eigenschaften. Aber ich bin nicht genug ein guter Programmierer, um es einzurichten, wenn jemand eine großartige Idee hätte, wäre es großartig!

Danke!

Antwort

0

Dies ist der Punkt, wo Sie wahrscheinlich beginnen sollten, Ihr Design zu überdenken, aber dennoch können Sie uns tatsächlich AutoMapper und Tracking deaktivieren.

Schauen Sie sich diesen Link: 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

Vielen Dank für Ihre Antwort. Dies ist derzeit meine "v2" dieser App und ich versuche derzeit, mein Design und thech beteiligt (Wechsel von asp.net // ef 6 zu asp.net Core und ef Core 2) zu erneuern. Können Sie mir sagen, was Sie vorhatten, als Sie sagen, dass ich mein Design überdenken sollte? Da ich kein Entwickler bin, versuche ich nur mit Google copy-paste und viel Kaffee zu schreiben :) –

Verwandte Themen