6

Veritabanına zaten eklenmiş bazı Ana kayıtlar var. Şimdi bazı çocuk kayıtları eklemek istiyorum.Alt kayıt zaten Varlık Çerçeve kodu kullanılarak var olduğunda alt tabloya çocuk tablosuna ekleme

  1. Veli (A) Al
  2. Çocuk Navigasyon özelliğine ebeveyn kaydı ekleme Yeni bir çocuk (B) kaydı
  3. oluştur kaydeder: Bunu yapmak için aşağıdaki adımları takip etti. B.A = A
  4. SaveChanges'i arayın. ben bu EF Yeni Bir Ana ekler ve sonra zaten ebeveyn varolan haritalama ile sadece çocuğa eklemek yerine yeni, yeni eklenen ebeveyne bir yabancı anahtar işaret çocuğa eklerim zaman

sorun olduğunu. Ayrıca, çocuğu kaydederken ebeveynin birincil anahtarını kontrol ettim ve veritabanında var.

Ebeveyn ve Çocuk için veritabanı oluşturulmuş kimlik kullanıyorum. Fark ettiğim tek şey, aynı bağlam nesnesinden Ebeveyn/Çocuk Kaydetme/Kaydetme işleminin daha iyi yapmasıydı.

Bu asap dosyasını düzeltmeniz gerekiyor. Herhangi bir yardım büyük takdir edilecektir.

cevap

18

Evet, bu işlem için aynı bağlamı kullanmalısınız. Mesele budur. Aynı bağlamı kullanmıyorsanız, hangi nesnenin ekleneceğini, hangi güncelleme ve değiştirilmeyeceğini manuel olarak kontrol etmelisiniz. sizin senaryoda dizisi olabilir:

context.Parents.Attach(parent); // just attach as unchanged 
context.Childs.Add(child); // add as inserted 
parent.Childs.Add(child); // make connection between existing and inserted object 
context.SaveChanges(); 

başka bir yaklaşım olabilir: Ayrıca

child.Parent = parent; 
context.Childs.Add(child); // both child and parent are marked as inserted!!! 
context.Entry(parent).State = EntityState.Unchanged; // set parent as unchanged 
context.SaveChanges(); 
+1

İkinci yaklaşım benim için çalıştı. Çok teşekkürler. – Amit

+0

Aynı problem var. Bir göz atın lütfen: http://stackoverflow.com/questions/16131090/the-relationship-could-not-be-changed-the-foreign-key-properties-is-non-nulla/16131494?noredirect= 1 # comment23046042_16131494? Sizi bağlamında "MamConfiguration_V1" alıyorum değişiklikleri kaydediyorum. Aynı bağlama bağlı. Akış: UI'de (düzenleme modu) sahip olduğum bir kimlikle MamConfiguration_V1'i alın (düzenleme modu) -> tüm değerleri UI'den atayın -> override \ add \ delete referans üyeleri (gezinme) 'MamConfigurationToBrowser_V1'. Bu bilgi eklendi mi? –

+0

+1 Her gün yeni bir şeyler öğreniyorum ve bu, gördüğüm bu sorunun en açık açıklaması. Teşekkür ederim! –

0

, eğer böyle bir şey varsa:

public class B 
{ 
[Key] 
public int Id {get;set;} 

public AId {get;set;} 

//... other properties here 

[ForeignKey("AId")] 
public virtual A ParentA {get;set;} 
} 

yalnızca ayarlayabilirsiniz DB'de varolan bir kimlik girdisi için yabancı anahtar ve ParentA null ve context.SaveChanges() üzerinde beklendiği gibi çalışır (beklendiği gibi çalışır. DB'de giriş.