Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

Entity Framework – Code First İle Stored Procedure Oluşturma

Merhaba,

Hangi mimaride inşa sürecine girersek girelim, hangi yaklaşım yahut prensip çerçevesini kendimize çizgi olarak belirlersek belirleyelim, hiç şüphesiz mevzu bahis veritabanına geldimi Stored Procedursüz bir veritabanı tasarımı söz konusu olamamakta, bu lezzet ve performanstan çalışmamızı mahrum bırakamamaktayız. Yani en azından şahsen ben böyle düşünüyorum 🙂 Hal böyleyken Entity Framework mimarisinde Code First yaklaşımında Stored Procedure oluşturmayı ve kullanmayı ele alalım diyorum. Hadi başlayalım.

Yazımıza başlamadan içerikle ilgili bir kaç öncelikten bahsetmek istiyorum. İlgili konuyu örneklendirirken EF – Code First çatısında bir proje örneklendirmesi yapılacaktır. Haliyle bu örneklendirmede gerekli tablo sınıflarını, Context sınıfımızı ve Generate sürecinde yapılacak işlemleri bildiğinizi varsayıyor ve içerikte bu işlemlerin yapıldığı varsayılarak örneklendirmeye konuyla ilgili noktadan başlanacağını belirtiyorum.

Eğer bu konular hakkında bilginiz yok veyahut tekrardan hatırlamak istiyorsanız öncelikle makalemizi temellendireceğimiz Entity Framework İle Code First Yaklaşımı ve Entity Framework – Code First Migrations İşlemleri başlıklı yazılar başta olmak üzere Entity Framework ve Code First üzerine olan önceki yazılarıma göz atmanızı tavsiye ediyorum.

EF Code First – Stored Procedure Oluşturma

EF Code First yapısı üzerinde Stored Procedure oluşturabilmek için iki farklı tekniği inceleyeceğiz.

Bu tekniklerden biri tabloya özel Insert, Update ve Delete sorgularını barındıran Stored Procedure yapıları oluşturmayken, bir diğeri ise T-SQL komutlarıyla Stored Procedure olarak Generate edeceğimiz yöntemdir.

Tabloya Özel Insert, Update ve Delete Sorgularını Barındıran Stored Procedure

Stored Procedure’ü oluştururken Context sınıfımızın “OnModelCreating” metodunda override ederek çalışacağız.

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Ogrenci>().MapToStoredProcedures();
        }

Yukarıdaki örnek kod bloğunu incelerseniz eğer ilgili tablo entitysi üzerinden “MapToStoredProcedures” metodunu çağırarak, o tabloya özel “Delete”, “Insert” ve “Update” Stored Procedure’lerini oluşturmuş oluyoruz.

Generate işleminden sonra veritabanımızı incelersek eğer;
Entity Framework - Code First İle Stored Procedure Oluşturma ve Kullanımı
gördüğünüz gibi yukarıda bahsettiğim sorgulara özel SP’ler oluşturulmuştur.
Tabi bu SP’lerin içeriklerine bakarsak eğer,

Entity Framework - Code First İle Stored Procedure Oluşturma ve Kullanımı Entity Framework - Code First İle Stored Procedure Oluşturma ve Kullanımı Entity Framework - Code First İle Stored Procedure Oluşturma ve Kullanımı
Delete Insert Update

Gördüğünüz gibi “Insert”, “Delete” ve “Update” sorgularına özel SP’lerimizi bu şekilde oluşturabiliyoruz.

“Peki! Bu SPlerin isimleri niye öyle hoca la?” diye sorarsanız eğer otomatik oluşturduğumuzdan dolayı olsa gerek. Kendisi SP’nin içeriğine göre anlamlı bir isim set etmektedir.

Eğer ki, oluşturulacak SP’nin ismine müdahale etmek istiyorsanız, aşağıdaki gibi işlem yapmanız gerekecektir.
Entity Framework - Code First İle Stored Procedure Oluşturma ve Kullanımı

Gördüğünüz gibi “modelBuilder” parametresi ile örnekte “Ogrenci” tablosuna özel “MapToStoredProcedures” metoduyla bir saklı yordam oluşturulmaya yeltenilirken oluşum sürecinde metodun istediği parametreye verilen lambda ifadesi karşımıza yukarıdaki “Delete”, “Insert” ve “Update” metodlarını getirdiğini görmenizi istedim.

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Ogrenci>().MapToStoredProcedures(
                o => o
                .Insert(i => i.HasName("sp_OgrenciEkle"))
                .Update(u => u.HasName("sp_OgrenciGuncelle"))
                .Delete(d => d.HasName("sp_OgrenciSil"))
                );
        }

Eğer yukarıdaki kod bloğunda gördüğünüz gibi, ilgili sorgulara özel işlem gerçekleştireceksek, “HasName” metodu ile oluşturulacak SP’nin isminide belirleyebilmekteyiz.

Entity Framework - Code First İle Stored Procedure Oluşturma ve Kullanımı

Peki daha fazla ne yapabiliriz?
Tabi ki de daha fazlasını…
Mesela şu ana kadar oluşturduğumuz SP’ler varsayılan olarak belirli kalıplarda oluşturulmuşlardır. Yani, Insert sorgusu; tüm kolonlara değer almaktayken, Update sorgusu; OgrenciID’ye göre tüm kolonları güncellemekte, Delete sorgusu ise; OgrenciID’ye göre veriyi silmektedir.

Yani bir tabloya özel SP’nin çalışacağı en geniş çerçevede oluşturulmaktadır. İşte biz bu çerçeveyi aşabilmekte ve istediğimiz işleyişte “Insert”, “Update” ve “Delete” sorguları oluşturabilmekteyiz. Tabi bunu yapabilmek için 2. oluşturma tekniğini göstereceğim.

Şimdi aşağıdaki kod bloğunu inceleyiniz.

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Ogrenci>().MapToStoredProcedures(
                o => o
                .Insert(i => i.HasName("sp_OgrenciEkle")
                              .Parameter(p => p.Adi, "adi")
                              .Parameter(p => p.SoyAdi, "soyadi"))
                );
        }

Kod bloğunda gördüğünüz gibi sadece “Insert” sorgusuna özel bir örneklendirme yapılmıştır. Dikkat ederseniz eğer, “sp_OgrenciEkle” isminde oluşturulacak SP’nin sadece “Adi” ve “SoyAdi” kolonlarının parametre isimleri değiştirilmiş ve bu parametrelere isim olarak sırasıyla “adi” ve “soyadi” değerleri verilmiştir. Aynı mantıkla diğer sorgulara özel SP’lerde de bu parametre değerlerine müdahale edilebilmektedir.

Şimdi Stored Procedure oluşturmanın daha esnek ve daha hakim 2. oluşturma yöntemini inceleyelim.

T-SQL Komutlarıyla Stored Procedure Oluşturma

Bu yöntemi uygulayabilmemiz için projemizde migrasyonları aktifleştirmemiz gerekmektedir. Bu işlem için, yukarı satırlarda vermiş olduğum Entity Framework – Code First Migrations İşlemleri başlıklı yazıyı inceleyebilirsiniz.

Dikkat ederseniz 1. yöntemde “Select” sorgusu üzerine bir SP’den bahsetmedim. Çünkü o yöntemde Select’e özel bir Generate bulunmamaktadır. Lakin bu 2. yöntemde bırakın Select komutuna özel SP’yi, içerisinde her türlü algoritmik mantığı barındıran ve değişkenler tutan bir SP oluşturabileceksiniz.

Öncelikle migrasyonları aktifleştirip ekledikten sonra “Package Manager Console” penceresinde “Add-Migration SPEkleyici” komutunu çalıştırarak SPEkleyici isiminde bir migrasyon ekleyiniz.(Tabi buradaki ismi siz istediğiniz gibi belirleyebilirsiniz)

    public partial class SPEkleyici : DbMigration
    {
        public override void Up()
        {
            CreateStoredProcedure(
                "dbo.OrnekSP",
                p => new
                    {

                    },
                body:
                    @"Select * from Ogrenciler"
            );
            
        }
        
        public override void Down()
        {
            DropStoredProcedure("dbo.OrnekSP");
        }
    }

Yukarıdaki kod bloğunu incelerseniz eğer “Up” metodu içerisinde çağrılmış olan “CreateStoredProcedure” isimli metod sayesinde veritabanımıza bir Stored Procedure oluşturabiliyoruz. İlgili metodun 1. parametresi SP’nin ismini, 2. parametresi SP’nin varsa parametrelerini ve 3. parametresi ise SP’nin sorgusunu almaktadır.

Bu şekilde Generate edildiyse eğer aşağıdaki gibi SP oluşacaktır.
Entity Framework - Code First İle Stored Procedure Oluşturma ve Kullanımı
Ayriyetten içeriğine bakarsak;
Entity Framework - Code First İle Stored Procedure Oluşturma ve Kullanımı
Gördüğünüz gibi sade, parametresiz bir SP oluşturulmuştur.

Peki parametreli nasıl oluşturacağız?
İşte böyle,

            CreateStoredProcedure(
             "dbo.OrnekSP",
             p => new
             {
                 Adi = p.String(),
                 SoyAdi = p.String(),
                 Memleketi = p.String(),
                 OgrenciID = p.Int(),
             },
             body:
                 @"
                  if(exists(Select * from Ogrenciler where OgrenciID = @OgrenciID))
                      begin
                          Update Ogrenciler Set Adi = @Adi, SoyAdi = @SoyAdi, Memleketi = @Memleketi where OgrenciID =     @OgrenciID
                      end
                  else
                      begin
                          Insert Ogrenciler(Adi, SoyAdi, Memleketi) Values(@Adi, @SoyAdi, @Memleketi)
                      end    
                  "
                                 );

Gördüğünüz gibi 2. parametrede belirttiğimiz ifadeler bir parametre özelliği sergileyecektirler ve o ifadelere karşılık gelen T-SQL parametre değerlerini body içerisindeki sorguda kullanmaktayız.

Entity Framework - Code First İle Stored Procedure Oluşturma ve Kullanımı
Bakın; istediğim tarzda bir SP oluşturmuş oldum.

Evet…
EF Code First ile Stored Procedure nasıl oluşturuluyor iki farklı yöntemle detaylıca incelemiş olduk. Aslında bu yazımda SP oluşturmanın yanında kullanımına da değinmek istiyordum ama teferruatlıca ele alınca içeriğin haddinden fazla şişeceğini düşündüm. O yüzden bir sonraki yazım muhtemelen ‘Entity Framework – Code First İle Stored Procedure Kullanımı’ başlıklı olacaktır.

Okuduğunuz için teşekkür ederim.
Sonraki yazılarımda görüşmek üzere…

İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

3 Cevaplar

  1. Mert dedi ki:

    Up fonksiyonunda oluşturduğumuz prosedürü nasıl güncelleyebiliriz ?

  2. OĞUZHAN SARI dedi ki:

    Bu bilgi çok iyi oldu. Code first te en çok merak ettiğim buydu. 🙂 Teşekkürler.

  1. 03 Nisan 2016

    […] önceki Entity Framework – Code First İle Stored Procedure Oluşturma başlıklı yazımda EF’de nasıl SP oluşturulduğunu detaylıca irdelemiştik. Bu […]

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir