Merhaba bu yazımda, Entity Framework üzerinden Store Procedure nasıl kullanılır onu işleyeceğiz.
İki türlü kullanım şekli mevcuttur:
1-) Bir Entity nesnesinizin Create, Delete yada 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.
Category adlı bir tablo barındıran bir Database'imiz olsun bizde bu tabloya yeni kayıt ekleme işlemi yapılırken Store Procedure aracılığı ile yapılmasını sağlayalım.
Önce Database'de 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
Database tarafındaki işlemlerimizi tamamladıktan sonra artık Visual Studio ortamımıza geri dönme vakti. Projenize daha önceden bir Entity Data Model eklediğinizi varsayıyorum.
O halde Database'den Entity Data Modelimize yeni eklediğimiz Category tablosu ve Store Procedure'ü 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 database'de henüz DataModel'de yer almayan bir tablo ve bir store procedure'müz var. Evet 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 neydi bu;
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.
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 güncelleyelim daha sonra da 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 Database'den 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.
Bir başka paylaşımımda görüşmek üzere arkadaşlar, umarım yararlı olmuştur.