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.
3 replies on “Attaching an entity of type ‘Entity Adı’ failed because another entity of the same type already has the same primary key value. This can happen when using the ‘Attach’ method or setting the state of an entity to ‘Unchanged’ or ‘Modified’ if any entities in the graph have conflicting key values. hatası”
Merhaba Ayni sorun bendede yashandi hall edemedim 🙁
updatedBanka = new Bankalar();
updatedBanka.bankId = ID;
updatedBanka.bankAdi = txtBankAdi.Text;
updatedBanka.Desc= txtDesc.Text;
updatedBanka.ChangedDateWho = 5;
updatedBanka.ChangedDatetime = CustomDate.GetDayMounthYear(DateTime.Now) + ” ” + CustomDate.GetHourMinute(DateTime.Now);
updatedBanka.isActive = true;
cnt.Entry(updatedBanka).State = System.Data.Entity.EntityState.Modified;
cnt.SaveChanges();
dostum diyoki
updatedBanka = new Bankalar();
yaptığın bölümde get yaparak çağır sonra gene hiçbirşeyi elleme
bkz:
cnt.set().get(a=>a.bankıd == ID).firstordefault();
updatedBanka.bankId = ID;
updatedBanka.bankAdi = txtBankAdi.Text;
updatedBanka.Desc= txtDesc.Text;
updatedBanka.ChangedDateWho = 5;
updatedBanka.ChangedDatetime = CustomDate.GetDayMounthYear(DateTime.Now) + ” ” + CustomDate.GetHourMinute(DateTime.Now);
updatedBanka.isActive = true;
cnt.Entry(updatedBanka).State = System.Data.Entity.EntityState.Modified;
cnt.SaveChanges();
Çok teşekkür ederim bir projeyi enkaz olmaktan kurtardınız 🙂