2016-07-10 9 views
0

Im db versuchen, mehrere Einheiten an die DB hinzuzufügen, aber ich bekomme diese Fehlermeldung:.NET mvc mehr als 1 enitity Zugabe

„Speicher oder akzeptieren Änderungen fehlgeschlagen, weil mehr als eine Einheit vom Typ‚Schema.Domain. DataModels.ActivitySummery 'haben den gleichen Primärschlüsselwert. Stellen Sie sicher, dass explizit festgelegte Primärschlüsselwerte eindeutig sind. Stellen Sie sicher, dass datenbankgenerierte Primärschlüssel ordnungsgemäß in der Datenbank und im Entity Framework-Modell konfiguriert sind. Verwenden Sie den Entitätsdesigner für Datenbank zuerst/Modell Erste Konfiguration Verwenden Sie die 'HasDatabaseGeneratedOption' fließende API oder 'DatabaseGeneratedAttribute' für die erste Code-Konfiguration. "

public void CreateNewGeneratedSchema(List<WeekDayViewModel> weekDays, int userId) 
    { 
     List<ActivitySummery> savedActivities = _schemaRepository.GetAllActivitySummeries(userId).ToList(); 
     foreach(ActivitySummery activitySummery in savedActivities) 
     { 
      _schemaRepository.DeleteActivitySummery(activitySummery.ActivitySummeryId); 
     } 

     foreach (WeekDayViewModel weekDay in weekDays) 
     { 
      foreach (ActivitySummeryViewModel activitySummeryViewModel in weekDay.ActivitiySummeries) 
      { 
       try 
       { 
        ActivitySummery activitySummery = new ActivitySummery() 
        { 
         ActivityId = activitySummeryViewModel.ActivityId, 
         WeekDayId = activitySummeryViewModel.WeekDayId, 
         //Change userId 
         UserId = 1, 
         StartTime = activitySummeryViewModel.StartTime, 
         EndTime = activitySummeryViewModel.EndTime, 
         ActivityDescription = activitySummeryViewModel.Description, 
         Activity = _schemaRepository.GetSpecificActivity(activitySummeryViewModel.ActivityId), 
         WeekDay = _schemaRepository.GetSpecificWeekDay(activitySummeryViewModel.WeekDayId) 
        }; 
        _schemaRepository.CreateActivitySummery(activitySummery); 
       } 
       catch (Exception) 
       { 
        throw new Exception("Something went wrong when trying to save the activity summery"); 
       } 
      } 
     } 
     _schemaRepository.Save(); 
     _schemaRepository.Dispose(); 
    } 

Ich kenne eine Lösung, die funktionieren könnte, und es ist das Speichern und Entsorgen des _schemaRepository nach jedem Hinzufügen eines Modells zur Datenbank und zum Erstellen eines neuen Instance von _schemaRepository. Aber ich bin mir nicht sicher, ob das der richtige Weg ist. Ich weiß, dass jedes Modell, das ich zu speichern versuche, das PK von 0 hat und ich denke, dass das das Problem sein könnte. Es funktioniert jedoch immer noch und die db akzeptiert die neuen Entitäten, aber ich bekomme immer noch die Ausnahme.

+0

[DatabaseGenerated (DatabaseGeneratedOption.Identity)] verwenden Sie einfach die Identität? –

+0

Ich bin nicht mit Code zuerst –

+0

tun, dass mit fleunt API dann müssen Sie nicht über die ID kümmern. –

Antwort

0

Wenn Ihr Modell (die Sie nicht zeigen), um den Primärschlüssel als ActivityId hat (was man auch nicht angeben), und es ist Setup automatisch generieren den Primärschlüssel:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
public int ActivityId { get; set; } 

Dann Sie müssen nicht enthalten den Primärschlüssel in der CreateActivitySummery Methode (auch die Sie nicht zur Verfügung gestellt haben).

// Remove this line... 
// ActivityId = activitySummary.ActivityId; 

Sie beachten Sie, dass eine (angemessene) Alternative die Datenbank zu erzeugen, um den Primärschlüssel automatisch zu verwenden Guid/Unique zu haben, ohne die Verwendung von DatabaseGenerated ist. Dann kann Ihr Anwendungscode Guid.NewGuid verwenden, um neue (vermutlich eindeutige) Primärschlüssel zu generieren, die problemlos eingefügt werden können und verwandte Entitäten problemlos verfolgen können.