Categories
Yazılım

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 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.

  1. Güncellenecek satırı birincil anahtarı ile bir nesneye çağır.
  2. Güncellenecek satırdaki alanları nesne üzerinde değiştir.
  3. 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();

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.