You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Bir veri üstünde işlem yapmak istiyorsak eğer Context nesnesinden bir adet instance oluşturmalıyız.
Context nesnemiz veritabanına karşılık gelir,Entity'miz veritabanındaki tablonun modeline karşılık gelir,ve bu Entity'lerden üretilen instance'lar ise o tablonun satırlarına karşılık gelir yani verileri tutan fiziksel/atomik yapılardır.
Burada ilk başta context sınıfından bir instance oluşturulur. Daha sonrasında ise Urun sınıfından oluşturduğumuz instance'ın içini doldurup (gerekli property/değişken değerleri) AddAsync(urun) fonksiyonu çağrılır daha sonrasında ise bu değişiklikleri kaydetmek ve sorgusunu oluşturmak için SaveChangesAsync() metodu çağrılır ve gerekli işlemler tamamlanmış yani nesne veritabanına eklenmiş olur.
context.AddAsync Fonksiyonu
Tip Güvensiz yani object olarak veri eklememizi sağlar.
awaitcontext.AddAsync(urun);
context.DbSet.AddAsync Fonksiyonu
Tip Güvenli veri eklememizi sağlar.
awaitcontext.Urunler.AddAsync(urun);
context.SaveChangesAsync()
SaveChanges üç aksiyonu gerçekleştiriken(insert,update,delete) veritabanının anlayacağı sorguları oluşturup bir transaction eşliğinde bunları veritabanına gönderip execute etmemizi sağlayan bir fonksiyondur. Eğer ki oluşturulan sorgulardan herhangi biri başarısız olursa tüm işlemleri geri alır.(rollback)
awaitcontext.SaveChangesAsync();
Entity Id Property'si
Eğer ki bir Id column'u oluşturuyorsanız EntityFrameworkCore'da ve bu kolonun türü int ise ya da sayısal bir kolonsa bunu otomatik identity specification özelliğini aktif hale getirir ve default olarak 1'den başlayarak 1'er 1'er arttırır bir özellikte/nitelikte generate ediyor.
publicintId{get;set;}
EF Core Açısından Bir Verinin Eklenmesi Gerektiği Nasıl Anlaşılıyor?
ETicaretContextcontext=new();Urunurun=new(){UrunAdi="B ürünü",Fiyat=2000};Console.WriteLine(context.Entry(urun).State);awaitcontext.AddAsync(urun);//Bu durumda state belirlendi(added)Console.WriteLine(context.Entry(urun).State);awaitcontext.SaveChangesAsync();Console.WriteLine(context.Entry(urun).State);
EntityState elimizdeki entity'e dair yapmış olduğumuz davranışın neticesinde onun durumunu bizlere söyler yani eklenecek mi silinecek mi ya da güncellenecek mi buna göre işlem yapılır.
Bununla ilgili yapmış olduğumuz davranış neyse ilgili EntityFrameworkCore yapılanmasında entity'e/veriye dair yapmış olduğumuz davranış neyse ona göre bir State belirleniyor ve bu State'in üzerinden EntityFrameworkCore veriye dair nasıl bir davranış sergileyeceğini modellemesini ortaya koyuyor. ona göre SaveChanges() Insert,Update,Delete sorgularını oluşturup veritabanına execute etmesi için gönderiyor.
Birden Fazla Veri Eklerken Nelere Dikkat Edilmelidir?
Veritabanı işlemlerinde transaction bir maliyettir.
Dolayısıyla biz yapacağımız işlemleri tek bir transaction içinde yapma derdindeyiz. Veritabanıyla ilgili maliyeti arttırmamak yada maliyetini azaltmak için
Her bir işlemde ayrı ayrı SaveChanges() kullanmak yerine en nihayetinde gidip SaveChanges talimatını vermeniz yeterli olacaktır.
Bu şekilde oluşturulan talimat neticesinde Kardeşim burada EF Core ile ilgili yapılan davranışlar/State'ler her neyse sen öncelikle bunların hepsini Tool aracılığıyla bir analiz et ardından SaveChanges'ı çağırdığında her bir işleme özel sorguyu tek bir transaction'da oluşturup veritabanına gönder.
SaveChanges fonksiyonu her tetiklendiğinde bir transaction oluşturacağından dolayı EF Core ile yapılan her bir işleme özel kullanmaktan kaçınmalıyız! Çünkü her işleme özel transaction veritabanı açısından ekstradan maliyet demektir. O yüzden mümkün mertebe tüm işlemlerimizi tek bir transaction eşliğinde veritabanına gönderebilmek için SaveChanges'ı aşağıdaki gibi tek seferde kullanmak hem maliyet hem de yönetilebilirlik açısından katkıda bulunmuş olacaktır.
AddAsync fonksiyonuna tabi tutulupta arka planda buna ait bir veri üretildiğinde SaveChanges Metodundan sonra bunun Id column'a generate edilen veri otomatik set edilecektir.Direkt oluşturduğumuz instance üzerinden bu veriye/Id Column'a erişim sağlayabiliriz.