2016-04-14 12 views
1

Ich arbeite in einem kleinen Projekt mit Web-API und Entity Framework. Und ich habe ein Problem mit der Veröffentlichung meiner Entität.Entity Framework in getrennten Szenario löst das Speichern oder Akzeptieren von Änderungen fehlgeschlagen, weil mehr als eine Entität vom Typ

Meine Entitäten wie folgt aussehen:

public class DayExercises 
    { 
     public DayExercises() 
     { 
      Exercises = new List<Exercise>(); 
     } 
     [Key] 
     public int Id { get; set; } 

     public string Day { get; set; } 

     public virtual ICollection<Exercise> Exercises { get; set; } 

    } 

und meine Exercise Einheit wie folgt aussehen.

public class Exercise 
    {  
     public Exercise() 
     { 
      DayExercises = new List<DayExercises>(); 
     } 
      public int Id { get; set; } 
      public string Name { get; set; } 
      public virtual List<DayExercises> DayExercises { get; set; } 
    } 

und meine Web-API-Methode für die dayExercises aussehen wie diese

[ResponseType(typeof(WorkoutTemplate))] 
    public IHttpActionResult PostWorkoutTemplate(DayExercises dayExercises) 
    {    
     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 

     foreach (var dayExercise in dayExercises) 
     { 
      fitnessDbContext.Entry(dayExercise).State = EntityState.Added; 

      foreach (var exercise in dayExercise.Exercises.ToList()) 
      { 
       fitnessDbContext.Entry(exercise).State = EntityState.Unchanged; 

      } 
     } 

     db.SaveChanges(); 

     return CreatedAtRoute("DefaultApi", new { id = dayExercises.Id }, dayExercises); 
    } 

Die Beziehung ist Many-to-Many-Posting.

Problem: Ich bin ein dayExercise mit bestehenden Exercise Senden (bereits in der Datenbank vorhanden) zu meiner Methode. aber wenn ich dayExercise mit SAME zwei Übungen poste. Diese Ausnahme wird ausgelöst:

Weitere Informationen: Das Speichern oder Akzeptieren von Änderungen ist fehlgeschlagen, weil mehr als eine Entität vom Typ 'FitnessFirst.WebApi.Exercise' denselben Primärschlüsselwert hat. Stellen Sie sicher, dass explizit festgelegte Primärschlüsselwerte eindeutig sind. Stellen Sie sicher, dass datenbankgenerierte Primärschlüssel in der Datenbank und im Entity Framework-Modell korrekt konfiguriert sind. Verwenden Sie den Entity Designer für die erste Konfiguration von Database/Model First. Verwenden Sie die ‚HasDatabaseGeneratedOption“ fließend API oder ‚DatabaseGeneratedAttribute‘ Code Erste Konfiguration.

Ich habe auch versucht Deattach, um die Einheiten und erhalten Sie die Übung aus der Datenbank mit ihren ID und Attach sie wieder und fügen Sie es dem dayExercise aber es speichern zu Datenbank nicht

HINWEIS:.. wenn ich zwei verschiedene Übungen hinzufügen, ist es nicht, dass die Exception wirft

ich lese auch folgende Antworten, aber es ist es nicht lösen: Ensure that explicitly set primary key values are unique

Irgendwelche Vorschläge oder Erklärungen.

Antwort

1

Ich weiß, dies ist ein alter Beitrag, aber ich lief gestern in die gleiche Frage. Das ist die Lösung, die ich mir ausgedacht habe. Im Allgemeinen ermöglicht der Entity Framework Change Tracker nur eindeutige Werte für eine Entität. Um den Fehler zu umgehen, müssen Sie überprüfen, ob die Entität bereits im Change Tracker vorhanden ist und diese Instanz verwenden.

var excercises = dayExercise.Exercises.ToList(); 
for (int i = 0; i < excercises.Count; i++) 
{ 
    var unchangedEntity = _dbContext.ChangeTracker.Entries<Exercise>() 
     .Where(xy => xy.State == EntityState.Unchanged && 
     xy.Entity.Id == excercises [i].Id).FirstOrDefault(); 

    if (unchangedEntity == null) 
    { 
     fitnessDbContext.Entry(excercises[i]).State = EntityState.Unchanged; 
    } 
    else 
    { 
     excercises[i] = unchangedEntity.Entity; 
    } 

} 
+0

HAHA, ya das ist ein sehr alter Beitrag, ich habe diese Lösung vor 1 Jahr erreicht. +1, weil du Recht hast. –