Entity Framework tutorial ından sonra bir de Entity Framework ile birlikte gelen EntityDataSource tutorial ı yayınlamak istedim. Kullanımı çok kolay olan ve hiç kod yazmadan istediğiniz birçok şeyi yapabileceğiniz bu datasource sayesinde proje geliştirme hızınız gözle görülebilir bir şekilde yükselecek.
Bu tutorial için Msdn de Entity Framework anlatımı sırasında da kullanılan “School” veritabanını ele alacağız. Şuradan kendisine ulaşabilirsiniz: http://msdn.microsoft.com/en-us/library/bb399731.aspx
İlk yapacağımız iş veritabanını yaratacak script i çalıştırarak “School” veritabanını kendi local makinamızda oluşturmak. Daha sonra üzerinde tutorial ımızı gerçekleştirmek için “Visual Studio 2008” de bir adet “Asp.Net Web Site” oluşturarak örneğimize başlayacağız.
Entity Framework ile çalışacağımız için “School” veritabanının “Entity Data Model” ini sistemimize ekliyoruz. Nasıl yapacağını bilmeyenler varsa önceki yazıma bakarak adım adım gerçekleştirebilirler.
Modeli oluşturduktan sonra oluşan şemaya dikkatli bakarsanız “Person” ve “Course” entity lerinin birbirlerine direkt olarak bağlandığını “CourseInstructor” adlı tablonun “Entity Data Model” de oluşturulmadığını göreceksiniz. Bunun sebebi bu tabloda ilişkiyi tutan sütunlar dışında sütun bulunmamasındandır. Entity Framework bu tarz tabloları kullanıcıya göstermez ve direkt olarak yönetilmesine izin vermez.
Örneğimizde “Department”, “Course” ve “Person” tablolarını EntityDataSource kullanarak yöneteceğiz. Her şey bittiğinde herhangi bir departmanı seçtiğimizde onunla ilişkili olan dersleri ve herhangi bir dersi seçtiğimizde ise o dersin öğretmenini görebiliyor olacağız.
İşlemlerimize “Department” ile başlıyoruz. Sayfaya bir adet “ListView” atıp ID sini ayarladıktan sonra arayüzden “Choose Data Source” a tıklayarak yeni bir “EntityDataSource” bağlamak istediğimizi belirtiyoruz.
“EntityDataSource” için hangi “ObjectContext” i kullanacağımızı seçiyoruz.
Hangi entity yi “EntityDataSource” ile yöneteceğimizi seçiyoruz. Burada dikkat etmemiz gereken “EntityDataSource” un hangi işlemleri bizim yerimize yerine getirmesini istiyorsak o işlemleri seçmemiz. Biz her şeyi “EntityDataSource” a bırakacağımız için hepsini seçiyoruz.
Bu işlemler bittikten sonra “ListView” kontrolünün kendisine bağladığımız “EntityDataSource” a uygun olarak şekillenmesi için arayüzden “Configure ListView” ı çağırıyoruz. “ListView” kontrolünün desteklemesini istediğimiz özelliklerini sol alttaki menüden seçebiliyoruz. Bunun yanında istersek “Layout” ve “Style” da belirleyebiliyoruz ben örnekte bunlara dokunmadım.
Buraya kadar yaptığımız işlemlerin aynılarını “Course” ve “Person” entity leri içinde tekrarlayacağız. Ben kuracağım yapıda her zaman tek bir satır geleceğinden “Person” için “FormView” kullanmayı tercih ettim. Bu işlemler bittikten sonra sayfayı çağırdığımızda “ListView” lar içinde fiziksel veritabanındaki verileri görebilirsiniz.
“ListView” lar entity nin veritabanı tablosunda normalde sütun olarak bulunmayan “Navigation Property” lerini de bulunduruyor olacak, bu sütunlar “EntityDataSource” kullanarak işlem yaptığımızda sorun yaratacaklar. O yüzden ilk iş olarak “ListView” ve “FormView” lardan fiziksel veritabanında bulunan sütunlar dışındaki sütunları silmemiz gerekiyor.
İkinci olarak düzelteceğimiz şey ise otomatik oluşturulan html kodu içerisinde kullanılan “[]” karakterleri. "[Department.DepartmentID]" gibi oluşturulan kodlardan bu karakterleri temizlememiz gerekecek. Bu iki işlemi yaptıktan sonra sorunsuz olarak tablolar üzerinde CRUD işlemlerini yapabiliyor olmanız gerekli.
Dikkat ederseniz “Course” tablosunda "Department.DepartmentID" sütununun boş geldiğini göreceksiniz, bunun sebebi Entity Framework un o sütunu “Department” tablosuyla ilişkilendirmiş olması. O sütunun da gözükmesi için yapacağımız şey “Course” ile ilgili yarattığımız “EntityDataSource” un “Include” parametresine “Department” yazmak. Eğer bir entity başka bir entity ile ilişki içindeyse ve biz entity i çektiğimizde ilişkili entity ninde gelmesini istiyorsak bunu “Include” parametresini kullanarak yapıyoruz. Birden çok entity ile ilişkilendirmek istiyorsak virgül ile ayırarak yazıyoruz.
Tabloları birbirleriyle ilişkilendirmeden önce bahsedeceğim iki konu daha var, bunlar sayfalama ve sıralama özellikleri. “EntityDataSource” hem “Paging” hem de “Sorting” i desteklemekte. Bunları aktif hale getirmek için yapacaklarınız ise çok basit:
“Sorting” için yapacağınız şey “ListView” objesinin html kodunu açıp “LayoutTemplate” inde “th” taglerinin arasında bulunan sütun adları yerine “LinkButton” lar koymak.
<th runat="server">
<asp:LinkButton ID="btnSortName" runat="server" CommandName="Sort" CommandArgument="Name">Name</asp:LinkButton>
</th>
“Paging” için ise yine “LayoutTemplate” de bulunan “DataPager” nesnesine “PageSize” parametresini eklememiz gerekiyor.
<asp:DataPager ID="DataPager1" runat="server" PageSize="4">
Temel özellikleri bitirdiğimize göre “EntityDataSource” ile filtreleme nasıl yapılıra geçelim. Filtreleme için kullanacağımız parametrenin adı “WhereParameters”. “WhereParameters” bir çok farklı yerden beslenebiliyor, hepsinin ismini saymak gerekirse bunlar: ControlParameter, CookieParameter, FormParameter, ProfileParameter, QueryStringParameter, SessionParameter.
Filtreleme için sadece “WhereParameters” ayarlamak yeterli olmuyor. Verdiğimiz bu parametrenin sorguda nasıl kullanılacağının da belirtilmesi gerekiyor. Bunu halletmenin iki yolu var birincisi “AutoGenerateWhereClause” parametresinin değerini “True” yaparak bu işi “EntityDataSource” a bırakmak yada “Where” parametresini kendimiz doldurmak.
Bu anlattıklarıma istinaden “Course” ile ilgili “EntityDataSource” un son hali şu şekilde oluştu:
<asp:EntityDataSource ID="edsCourse" runat="server" ...
Where="it.Department.DepartmentID = @DepartmentID">
<WhereParameters>
<asp:ControlParameter ControlID="lvDepartment" Name="DepartmentID" Type="Int32" />
</WhereParameters>
</asp:EntityDataSource>
“Person” entity si ile ilgili “EntityDataSourse” ise şu şekilde olacak:
<asp:EntityDataSource ID="edsPerson" runat="server" ...
Where="EXISTS(SELECT VALUE p FROM it.Course AS p WHERE p.CourseID = @CourseID)">
<WhereParameters>
<asp:ControlParameter ControlID="lvCourse" Name="CourseID" Type="Int32" />
</WhereParameters>
</asp:EntityDataSource>
Fark edebileceğiniz üzere “Person” için yazdığımız “Where” parameteresi diğerinden çok daha farklı. Bunun sebebi “Department” ile “Course” birbirine “DepartmentID” ile bağlıyken, “Course” ile “Person” nın birbirine aslında entity olarak gözükmeyen “CourseInstructor” adlı bir tablo ile bağlı olması. Bunun sonucunda “Course” için “it.Department” dediğimizde tek bir nesne dönerken, “Person” için “it.Course” dediğimizde nesne kümesi dönüyor, dolayısı ile “Where” parametresini bu yapıya uygun olarak oluşturmamız gerekli.
Tüm bunları tamamladıktan sonra “Department” ve “Course” tablolarına “Select” işlemini gerçekleştirecek “LinkButton” ları da koymayı da unutmuyoruz tabiki. “Select” buttonları otomatik olarak gelmiyor, “ItemTemplate” de istediğimiz yere kendimiz koyuyoruz:
<asp:Button ID="SelectButton" runat="server" CommandName="Select" Text="Select" />
Temel olarak “EntityDataSource” ile nasıl uygulama geliştirilebileceğini görmüş olduk. Tüm bu işlemleri yaparken bir iki satır html dışında kod yazmadığımıza tekrar dikkat çekmek istiyorum. Tabiki eksikleri ve tüm ihtiyaçlarınızı karşılamadığı yerler olacaktır ancak, “EntityDataSource” kullanmak zaman ve iş gücü sorunu olan bir çok projede hayat kurtarabilir.
Projenin çalışan halini şuradan indirebilirsiniz:
EntityDataSourceTest.rar (68,02 kb)