2013-01-23 24 views
9

Yapmak istediğim basittir. db'de bir parça listesi var ve bunları bir güncelleme listesine göre silmek/eklemek/güncellemek istiyorum.Entity Framework 5: İçeriği girdide değiştirmek için uygun yöntem

Ana sorun, bir girdiyi değiştirmek istediğimde, daha eski (güncellenmesi gereken) girdinin zaten eklenmiş olması (önceki okunmuş bir aramaya göre) ve bir istisna atılması nedeniyle içeriğe ekleyememektir.

3 düşünce ile geldim.

  1. Elle Ayır eski giriş ve takmak yenisi (müstakil nedeniyle tarafın durumunu değiştirerek hala atar rağmen istisna)
  2. Manuel yenileri ile eski giriş değerlerini değiştirmek
  3. okuma çağrı olmayan olun izlenebilir (AsNoTracking()), bu iyi çalışıyor gibi görünüyor ama tembel yük üzerinde etkisi hakkında endişe duyuyorum.

"context.entry.replace (oldEntry, newentry)" veya benzeri herhangi bir işlevsellik bunu yapmak için başka uygun bir yolu var mı?

IEnumerable<SoldPart> old = db.SoldParts.Where(sp=>sp.sessionId == sessionId); 

       var toDelete = old.Where(po=> !parts.Any(pu=>pu.id == po.id)); 
       var toCreate = parts.Where(po => !old.Any(pu => pu.id == po.id)); 
       var toUpdate = parts.Where(po => old.Any(pu => pu.id == po.id)); 


       foreach (SoldPart item in toDelete) 
       { 
        db.SoldParts.Attach(item); 
        db.SoldParts.Remove(item); 
       } 
       foreach (SoldPart item in toCreate) 
       { 
        db.SoldParts.Add(item); 
       } 

       foreach (SoldPart item in toUpdate) 
       { 

        db.SoldParts.Attach(item); 
        db.Entry(item).State = EntityState.Modified; 
       } 


       db.SaveChanges(); 
+0

İçeriğiniz zaten silmek/eklemek/güncellemek istediğiniz varlıkları izlemekte neden sadece doğrudan işlem gerçekleştirmiyor? –

cevap

28

Ekli öğenin değerlerini ayrık olandan güncellemenin otomatik bir yolu vardır, ancak yalnızca skaler/karmaşık özelliklerde çalışır. Gezinme özelliklerinde yok:

deb.Entry(oldEntry).CurrentValues.SetValues(newEntry); 
+0

@drunkcamel: Açıklayabilir misiniz? Varlık PK'ye sahip olmalı, aksi halde bu bir varlık değildir. –

+0

Üzgünüm, bunu denedim ve bir özellik varlığın bir varlık anahtarının bir parçası olduğunu ve atanamaz. Ama şimdi yeniden üretmeye çalıştım ve yapamadım. – drunkcamel

+0

@drunkcamel: Muhtemelen “oldEntry” ve “newEntry” nin varlık anahtarının farklı bir değeri vardı. Mevcut varlığın anahtarını değiştiremeyeceğiniz için başarısız olabilir. –