Makale Özeti

Bu yazımızda Entity Framework kullanılan uygulamalarda veritabanında tanımlanan stored procedure nesnelerini nasıl kullanabileceğimizi inceliyoruz.

Makale

Store Procedure(Saklı Yordam), yazılım platformundan parametre alabilen ve yaptığı işlemler sonucunda yazılım platformuna geri değer döndürebilen veya döndürmeyen, Veritabanı tarafında çalışan kayıtlı nesnelerdir. Entity Framework aslında kendi doğasında CRUD işlemlerini yapabilen bir yapıdır. Fakat belirli noktalarda veritabanında çalışacak sorguların daha hızlı ve performanslı olması kriteri devreye girdiği zaman veritabanı ile ilgili işlemleri Store Procedure'ler ile yapma ihtiyacı duyulacaktır. İşte bende bu yazımda o ihtiyaç anında Store Procedure'leri Entity Framework içerisinde nasıl kullanabileceğimizi anlatmaya çalışacağım.

Entity Framework içerisinde strored procedure'leri iki türlü kullanım şekli mevcuttur:

1-) Bir Entity nesnesinizin Create, Delete ya da Update olayına ilgili Store Procedure'u tanımlayarak.
2-) Modelinize yüklediğiniz bir Store Procedure'ü istediğiniz her an kullanabilmeniz için Function Imports klasörüne tanımlayarak.

Şimdi gelelim bu 2 kullanım şeklini uygulayarak yapacağımız basit bir senaryo oluşturmaya. Örneğimizde belirli kategorileri saklayan bir tablo üzerinde işlemler yapmayı amaçlıyoruz. Category adlı bir tablo barındıran bir veritabanımız olsun. Bu tabloya yeni kayıtlar eklemek için veritabanı tarafında oluşturulan stored procedure'leri uygulamamızda nasıl kullanacağımızı görelim.

Önce veritabanında Category tablomuzu aşağıdaki gibi oluşturalım.



Tablomuzu oluşturduktan sonra sıra geldi bu tabloya yeni kayıt ekleme yapacak olan Store Procedure'ümüzü hazırlamaya. Ben Store Procedure'ün ismini sp_add_category olarak verdim.

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON

go

CREATE PROCEDURE [dbo].[sp_add_category]

(

@Slug nvarchar(250),

@Name nvarchar(250),

@Active bit,

@ImageUrl nvarchar(100),

@ParentCatId int

)

AS
BEGIN

SET NOCOUNT ON;
insert into Category (Slug, Name, Active, ImageUrl, ParentCatId)
values

(@Slug, @Name, @Active, @ImageUrl, @ParentCatId)

END



Veritabanı tarafındaki işlemlerimizi tamamladıktan sonra artık Visual Studio ortamımıza geri dönme vakti geldi. Projenize daha önceden bir Entity Data Model eklediğinizi varsayıyorum. O halde veritabanından Entity Data modelimize yeni eklediğimiz Category tablosunu ve Store Procedure'ünü ekleyelim.

Model Browser'ınızın içinde sağ tıklayın ve Update Model From Database seçeneğini seçerek devam edelim. Bu adımda Add sekmesinde yer alan Tables ve Store Procedures yazılarının yanındaki kutuları işaretleyelim. Malum veritabanında henüz DataModel'de yer almayan bir tablo ve bir stored procedure'müz var. Dolayısıyla karşımıza şöyle bir ekran gelecektir.




İlgili kutuları işaretledikten sonra Finish butonuna basalım. Pencere kapandıktan sonra sağ taraftaki Model Browser'ımızın son hali aşağıdaki gibi değişecektir.



Entity Model'imize öğelerimizi başarıyla ekledikten sonra asıl yapmak istediğimiz konuyu hatırlayalım; Category tablosuna yeni kayıt ekleneceği zaman Entity Model'imizden SQL'e bir sorgu cümlesi değil de bir Store Procedure aracılığı ile yeni kayıt eklenmesini sağlamak.

Yazının başında da bahsettiğim gibi bunu 2 şekilde yapabiliyoruz.

1. Entity nesnesinizin Create, Delete yada Update olayına ilgili Store Procedure'u tanımlamak

Category Entity'mize ilgili store procedure'ü insert function olarak tanımlama işlemini yapmak için, Category Entity nesnemize sağ tıklayın, çıkan pencereden Stored Procedure Mapping seçeneğini tıklayın.

Bu menüyü tıkladıktan sonra ekranın altında Mapping Details paneli açılacaktır. Bu panelin sol tarafında alt alta iki sekme bulunmakta biz alttakini yani "Map Entity to Functions" seçeneğini seçeceğiz.
a

Map Entity to Functions seçeneğini seçtikten sonra aşağıdaki gibi 3 tane fonksiyon tipini göreceksiniz. (Insert, Update, Delete) Bunlara istediğimiz Store Procedure'lerimizi bağlayabiliyoruz. Bizim ki Insert Function, aşağıdaki animasyonlu resimde de adımları göreceğiniz gibi dropdown'a tıkladığımız zaman DB'den Entity Model'e yüklediğimiz 'sp_add_category' adlı store procedure listelenmektedir. Biz bunu seçiyoruz ve seçtikten sonra, önce Ctrl + S yapıp Modelimizi kaydedelim ve daha sonra projemizi build edelim. Bu sayede artık Entity Modeliniz üzerinden her zaman yaptığınız gibi bir kayıt ekleme işlemini SQL sorgusu ile değil bir Store Procedure aracılığı ile gerçekleştirecektir.



ÖNEMLİ : Dikkat edilmesi gereken bir husus var; Store Procedure'ünüzde aldığınız parametrelerin adları tablodaki alan adları ile yani entity nesnenizdeki property'lerin adları ile uyuşmaz ise, yukarıdaki resimde 3.ncü adıma geldiğinizde Property alanından paremetrenin entity nesnenizdeki hangi property ile eşleşeceğini bildirmeniz gereklidir.


2. Modelinize yüklediğiniz bir Store Procedure'ü istediğiniz her an kullanabilmeniz için Function Imports klasörüne tanımlamak
Bu işlemi yapmak için veritabanından güncellediğiniz Entity Modelinizin sağ tarafında yer alan Model Browser'ın altında yer alan EntityContainer sekmesininde altında bulunan Function Imports klasörüne sağ tıklayıp Add Function Import seçeneğini tıklamanız gereklidir. (EntityModel > Model Browser > EntityContainer > FunctionImports) Daha sonra çıkan pencerede de sizden hangi store procedure'ü ekleyeceğinizi ve buna C# bazında kullanacağınız bir fonksiyon ismi vermenizi isteyecektir. Aşağıdaki resimlerde ilgili adımlar gösterilmiştir ve C# tarafında nasıl kullanacağımızı gösteren örnek bir kod parçacığı bulunmaktadır.








Üstteki kod parçacığı örneğinde gördüğümüz gibi Entity modelimizden aldığımız instance ile fonksiyonumuza direk erişim sağlayabiliyor ve kullanabiliyoruz. Bu şekilde Entity Framework kullandığımız uygulamalarda veritabanında tanımlanan stored procedure nesnelerini nasıl kullanabileceğimizi incelemiş olduk.

Bir başka paylaşımımda görüşmek üzere arkadaşlar, umarım yararlı olmuştur.