none
Entity Framework RRS feed

  • Genel Tartışma

  • Merhaba, 

    Entity Framework kullanarak, bir otomasyon geliştiriyorum. Kira tablosunda sil butonuna tıkladıktan sonra, silinen elemanın Odemeler tablosuna eklemek istiyorum. Tablolar bir kiranın birden fazla ödemesi olabilir şeklinde birbirleriyle ilişkili. Silme kısmında sıkıntı yok ama silinen elemanı ödemeler tablosuna ekleyemiyorum. Nasıl yapabilirim ? 

    8 Kasım 2020 Pazar 10:36

Tüm Yanıtlar

  • Kodları görmediğimden tam olarak yorum yapamıyorum ancak şunu belirtebilirim.

    Silinen eleman zaten elinde. Örnek vermek gerekirse

    using (var context = new DatabaseAdinDbContext())
                {
                    YeniTablon tablo = new YeniTablon(){
                    //burada yeni oluşturacağın tabloya göre, entity'den değerleri alabilirsin. Tablo kolonlarını bilmediğimden dolayı 2 örnek verdim.
                    KiraId = silinecek.Id,
                    digerdeger = silinecek.digerdeger
                    };
    
                    //silinecek kayıtla işin bittiğinden, veritabanından da silebilirsin. Buradaki silinecek senin silinecek olan kaydın.
                    context.TabloAdin.Remove(silinecek);
                    context.YeniTablon.Add(tablo);
                    //daha sonraki kodlarda farklı bir işlem yapmak istiyorsan devam edebilirsin ya da savechanges ile kaydedebilirsin.
                }

    8 Kasım 2020 Pazar 11:04
    Moderatör
  • Öncelikle cevap verdiğiniz için teşekkür ederim. 

       private void button3_Click(object sender, EventArgs e)
            {
                
                
                using (var context = new MyContext())
                {
                    Kira sil = new Kira();
                    var id = (Guid)dataGridView1.CurrentRow.Cells[0].Value;
                    sil = context.Kiralar.FirstOrDefault(v => v.Id == id);
                    sil.Arac.KiraDurum = false;
                    FormOdeme formOdeme = new FormOdeme();
                    formOdeme.Show();
                    
                    Odeme odeme = new Odeme()
                    {
                        KiraId = sil.Id,
                        toplam_tutar = sil.Toplam_tutar,
                        BaslangicTarih = sil.Tarih,
                        BitisTarih = sil.Sure
                    };
                    context.Kiralar.Remove(sil);
                    context.Odemeler.Add(odeme);
                    context.SaveChanges();
                }
               
            }

    Bu şekilde yapıyorum. Button3 silme buttonum. Ama uygulamayı çalıştırıp datagridden eleman seçip button3'e tıkladığımda,

    System.Data.Entity.Infrastructure.DbUpdateException: 'Unable to insert or update an entity because the principal end of the 'AracKiralama.Odeme_Kira' relationship is deleted.'

    şöyle bir hata alıyorum.

    8 Kasım 2020 Pazar 11:28
  • Öncelikle aldığınız hata Releationship ile ilgili. Burada tablo yapınıza bakmak lazım. Fikir vermesi açısından burada yer alan örneklere bakabilirsiniz.

    Ek olarak belirtmem gerekirse, projenin ileride büyüyeceğini de düşünerek, butonlara mutlaka isim verin. Örneğin Button3 yerine, btnSil vb. gibi. Kod karmaşasından kurtulursunuz. 

    Ayrıca gelen kaydın ( Kira ) boş olup olmadığına da bakın. 

    Form gösterme işini en sonra bırakın (formda başka işlemler de yapabilirsiniz vb.)

    Fikir vermesi için : 

     private void button3_Click(object sender, EventArgs e)
            {
                try
                {
                    using (var context = new MyContext())
                    {
                        var id = (Guid)dataGridView1.CurrentRow.Cells[0].Value;
                        Kira sil = context.Kiralar.Where(x => x.Id == id).FirstOrDefault();
                        if (sil != null)
                        {
                            sil.Arac.KiraDurum = false;
                            Odeme odeme = new Odeme()
                            {
                                KiraId = sil.Id,
                                toplam_tutar = sil.Toplam_tutar,
                                BaslangicTarih = sil.Tarih,
                                BitisTarih = sil.Sure
                            };
                            context.Kiralar.Remove(sil);
                            context.Odemeler.Add(odeme);
                            context.SaveChanges();
                            FormOdeme formOdeme = new FormOdeme();
                            formOdeme.Show();
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }


    barissaritas @ windowslive . com

    8 Kasım 2020 Pazar 12:05
    Moderatör
  • Silmeden önce ödemeler tablosuna ekleyin. Daha sonra silin. Son olarak savechanges yapın düzelmesi gerekir.

    İlk başta veriyi sildiğiniz için ekleyecek veriyi bulamıyor sanırım.

    8 Kasım 2020 Pazar 16:29