none
Entity Framework SaveChanges() Problemi RRS feed

  • Soru

  • Merhabalar, çok çok ilişkili tablolarda güncelleme yaptığım zaman şöyle bir hata alıyorum.

    İki nesne arasındaki ilişki tanımlanamaz çünkü farklı ObjectContext nesnelerine iliştirilmiş durumdalar.

    kontrol ediyorum ama bir türlü hatayı bulamıyorum. 

     public bool IcerikGuncelle(int Iid, string icerikAdi, string ozet, string icerik, string icerikVideo, List<Etiketler> Etiket, bool yayindami, bool sliderdemi, bool yorumYapilsinmi, bool anasayfadami, List<Resimler> resimler, List<int> kategorilerim, List<OzellikIcerik> OzelliklerListesi)
            {
    
                bool sonuc = false;
                using (DataProvider db = new DataProvider())
                {
                    Icerikler i = db.Icerikler.Include("Kategoriler").Include("OzellikIcerik").Include("Resimler").Single(c => c.IcerikId == Iid);
                    i.IcerikAdi = icerikAdi;
                    i.IcerikOzet = ozet;
                    i.IcerikVideo = icerikVideo;
                    i.AnaSayfadami = anasayfadami;
                    i.Begendim = 1;
                    i.Begenmedim = 1;
                    i.Hit = 1;
                    i.Icerik = icerik;
                    i.Yayindami = yayindami;
                    i.YorumYapilsinmi = yorumYapilsinmi;
                    i.Sliderdemi = sliderdemi;
                    List<Kategoriler> katList = db.Kategoriler.ToList();
                    List<Kategoriler> EklenecekKategoriler = new List<Kategoriler>();
                    i.OzellikIcerik.Clear();
                    i.Kategoriler.Clear();
                    i.Resimler.Clear();
                    foreach (Kategoriler k in katList)
                    {
                        foreach (int KatId in kategorilerim)
                        {
                            if (k.KategoriId.ToString().Contains(KatId.ToString()))
                            {
                                EklenecekKategoriler.Add(k);
                            }
                        }
                    }
                    try
                    {
                        if (EklenecekKategoriler != null)
                        {
                            if (EklenecekKategoriler.Count > 0)
                            {
                                foreach (Kategoriler kk in EklenecekKategoriler)
                                {
                                    i.Kategoriler.Add(kk);
                                }
                            }
                        }
                        if (resimler != null)
                        {
                            if (resimler.Count > 0)
                            {
                                foreach (Resimler rr in resimler)
                                {
                                    i.Resimler.Add(rr);
                                }
                            }
                        }
                        if (Etiket != null)
                        {
                            if (Etiket.Count > 0)
                            {
                                foreach (Etiketler item in Etiket)
                                {
                                    i.Etiketler.Add(item);
                                }
                            }
                        }
                        if (OzelliklerListesi != null)
                        {
                            if (OzelliklerListesi.Count > 0)
                            {
                                foreach (OzellikIcerik item in OzelliklerListesi)
                                {
                                    i.OzellikIcerik.Add(item);
                                    
                                }
                            }
                        }
                        db.SaveChanges();
                        sonuc = true;
    
                    }
                    catch (Exception ex)
                    {
                        sonuc = false;
                    }
                }
                return sonuc;
            }

    (konuyu asp.net formunda actıgım için özürdilerim)


    bunyaminabay.com



    • Düzenleyen Bünyamin 20 Şubat 2013 Çarşamba 04:15
    20 Şubat 2013 Çarşamba 02:54

Yanıtlar

  • Aynı DataContext nesnesini kullandığından emin misin? Farklı olunca bu durum meydana gelir. Anladığım kadarıyla bir şekilde yeni bir instance oluşuyor bir yerlerde.

     

    • Yanıt Olarak İşaretleyen Bünyamin 21 Şubat 2013 Perşembe 02:57
    20 Şubat 2013 Çarşamba 09:59
  • Aynı DataContext nesnesini kullandığından emin misin? Farklı olunca bu durum meydana gelir. Anladığım kadarıyla bir şekilde yeni bir instance oluşuyor bir yerlerde.

     

    sanırım parametre olarak gelen List<T> lerden biri farklı context'te

    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com
    MCC

    • Yanıt Olarak İşaretleyen Bünyamin 21 Şubat 2013 Perşembe 02:57
    20 Şubat 2013 Çarşamba 15:25
    Moderatör
  • Esas problem veri çektiğiniz contexten farklı contextte değişiklik yaptığınızdan olur. Veri çekerken ve eklerken problem olmaz ama silerken yada değiştirirken aynı context kullanılmalı.

    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com
    MCC

    • Yanıt Olarak İşaretleyen Bünyamin 21 Şubat 2013 Perşembe 02:57
    20 Şubat 2013 Çarşamba 22:31
    Moderatör

Tüm Yanıtlar

  • Aynı DataContext nesnesini kullandığından emin misin? Farklı olunca bu durum meydana gelir. Anladığım kadarıyla bir şekilde yeni bir instance oluşuyor bir yerlerde.

     

    • Yanıt Olarak İşaretleyen Bünyamin 21 Şubat 2013 Perşembe 02:57
    20 Şubat 2013 Çarşamba 09:59
  • Aynı DataContext nesnesini kullandığından emin misin? Farklı olunca bu durum meydana gelir. Anladığım kadarıyla bir şekilde yeni bir instance oluşuyor bir yerlerde.

     

    sanırım parametre olarak gelen List<T> lerden biri farklı context'te

    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com
    MCC

    • Yanıt Olarak İşaretleyen Bünyamin 21 Şubat 2013 Perşembe 02:57
    20 Şubat 2013 Çarşamba 15:25
    Moderatör
  • Sevgili Önay Hocam ve AAKoken ben çoka çok ilişkili tablolarda işlem yaptırıyorum muhtemelen ondan problem çıkıyor. ancak içerik eklerken gayet normal çalışıyor, güncelleme yaptıgımda ise bu problemi veriyor doğrusu hiç bişey anlamadım. 

    bir içeriği güncellemek için ilk etapta onu veritabanından çekiyorum ve o context nesnesiyle işim kalmıyor. sonra webformda bunu düzenleyip yeni bir context nesnesi oluşturup onu güncellemek istiyorum bunda anormal bir taraf var mı? çok ilginç bir durum. malesef entity framework ile ilgili pek bir kaynak bulamıyorum. çoka çok ilişkili tablolarda nasıl güncelleme yapılır buna dair tavsiye edebileceğiniz bir örnek, veya uygulama varmı acaba?


    bunyaminabay.com

    20 Şubat 2013 Çarşamba 19:56
  • Esas problem veri çektiğiniz contexten farklı contextte değişiklik yaptığınızdan olur. Veri çekerken ve eklerken problem olmaz ama silerken yada değiştirirken aynı context kullanılmalı.

    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com
    MCC

    • Yanıt Olarak İşaretleyen Bünyamin 21 Şubat 2013 Perşembe 02:57
    20 Şubat 2013 Çarşamba 22:31
    Moderatör
  • Önay Hocam Problem çözüldü Çok Şükür. Problem sizinde söylediğiniz gibi

    içerik.Kategoriler.Add(KategoriNesnesi) istiyor bende bu kategori nesnesini farklı bir sınıfta hazırlayıp bu metoda veriyordum.

    ama bu hataya neden oluyordu.

    sizin yönlendirmenizle bu sefer kategori nesnesini hazırlamayıp sadece o kategorinin Id sini aldım ve içerik güncellenirken veritabanından id si şu olan kategoriyi getir dedim ve içerik.Kategoriler.Add() metoduna verdim. sorunsuz bir şekilde güncelledi.

    geriye kalan bütün çoka çok ilişkili tablolardada aynı işlemi yaptım.


    bunyaminabay.com

    21 Şubat 2013 Perşembe 02:56