Merhaba sevgili kod severler, 🙂
Yine kod yazmakla geçen gecelerim birinde Entity Framework code first yaklaşımı ile tablo bağımsız update işlemi yapmak amacı aşağıdaki kodu yazdım. kodların geri kalan kısmında ilgili context ile diğer nesnelerim ve generic class için Tentity adında bir sınıf oluşturdum.
/*Burada id isim gibi alanların verileri alındı. Örn:*/ company.IsActive = mainForm.mrdbtnActive.Checked ? true : false; company.Iban = mainForm.mtxtIban.Text; company.IsSupplier = mainForm.mcboxSupplier.Checked ? true : false; company.IsCustomer = mainForm.mcboxCustomer.Checked ? true : false; BCompanyInfo.Update(company);
Güncelleme işleminin olduğu fonksiyonum.
public void Update(TEntity data) { context.Entry(data).State = EntityState.Modified; context.SaveChanges(); }
Bu kod her ne kadar çalışması gerektiği gibi gözükse de company entitysi için oluşturan class daha önceden çekilmediği için bu sorun yaşandı. Yani biz her ne kadar id ve değişecek alanları içeren bir nesnemizi Update() metoduna yollasak dahi yollamadığımız alanlar ve ilişkiler null olarak gideceğinden EF otomatikmen bunların yeni bir girdi olduğunu düşünerek hata veriyor. Zaten hataya baktığımızda “…because another entity of the same type already has the same primary key value. ” yani çünkü aynı tipteki başka bir entity aynı birincil anahtara (id’ye) sahip. Sorunun çözümü ise oldukça basit.
- Güncellenecek satırı birincil anahtarı ile bir nesneye çağır.
- Güncellenecek satırdaki alanları nesne üzerinde değiştir.
- Değiştirilen nesneyi güncelleme metoduna yolla.
Yani…
CompanyInfo company = new CompanyInfo(); /*Satırımızdaki verilerin tamamını çekelim.*/ company = BCompanyInfo.BringId(companyId); /*Title alanımızı değiştirelim.*/ company.Title = mainForm.mtxtDetailTitle.Text; /*Verisini değiştirdiğimiz nesnemizi update metodumuza yollayalım.*/ BCompanyInfo.Update(company);
Sorunuz olursa önceden kodlarını yorumlara atmanız cevap süresinde sizin faydanıza olacaktır. İyi çalışmalar.