2016-04-14 27 views
1

Web API'sı ve varlık Çerçevesi kullanılarak küçük bir projede çalışıyorum çünkü kaydedilemedi veya değişikliklerin kaydedilmesi başarısız oldu. Ve varlığımı yayınlarken bir sorunla karşı karşıyayım.Bağlantılı senaryodaki Varlık Çerçevesi, birden çok varlık türü

Benim varlıklar şuna benzer:

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

    } 

ve benim Exercise varlık buna benziyor.

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

ve bu

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

ilişki gibi dayExercises göz yazabilmek için benim web API yöntemi Birçok-çok olduğunu.

Sorun: benim yöntemine (veritabanında zaten var olan) Exercise mevcut olan bir dayExercise gönderiyorum. ama ben iki egzersizle dayExercise gönderdiğimde. Bu özel durumu:

Ek bilgi: Değişikliklerin kaydedilmesi veya kabul edilmesi başarısız oldu, çünkü "FitnessFirst.WebApi.Exercise" türünde birden fazla öğe aynı birincil anahtar değerine sahip. Açık bir şekilde ayarlanmış birincil anahtar değerlerinin benzersiz olduğundan emin olun. Veritabanı tarafından oluşturulan birincil anahtarların veritabanında ve Entity Framework modelinde doğru şekilde yapılandırıldığından emin olun. Veri Tabanı Önce/Model İlk yapılandırması için Varlık Tasarımcısı'nı kullanın. Ben de Deattach için varlıkları çalıştı

. Kod İlk yapılandırma için 'HasDatabaseGeneratedOption" akıcı API veya 'DatabaseGeneratedAttribute' kullanın ve onların ID ve Attach bunları tekrar kullanarak veritabanından egzersiz yapın ve dayExercise eklemek ama veritabanına kaydetmez

NOT:.. iki farklı egzersizleri eklediğinizde, o İstisna atmaz

şunlarla yanıtları okuyun ama bunu çözmez: Ensure that explicitly set primary key values are unique

Herhangi bir öneri veya açıklama.

cevap

1

Bu eski bir yazı olduğunu biliyorum, ama dün aynı sorunla karşılaştım. Bu benim ortaya koyduğum çözüm. Temel olarak varlık çerçevesi değişim izleyicisi, bir varlık için sadece benzersiz değerlere izin verir. Böylece hatayı gidermek için varlığın değişiklik izleyicide var olup olmadığını kontrol etmeli ve bu örneği kullanmalısınız.

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 bu çok eski bir yazı, bu çözüme 1 yıl önce ulaştım. +1 çünkü haklısın. –