Makale Özeti

Bu yazımızda, ASP.Net ile web uygulamalarımızda Entity Framework(EF) ile Gridview’de Çoktan Çoğa İlişki konusunu ele alacağız.

Makale

ASP.NET web Uygulamalarında Gridview’de
Entity Framework ile Çoktan Çoğa İlişki

Merhaba değerli arkadaşlar,

Bu yazımızda, ASP.Net ile web uygulamalarımızda Entity Framework(EF) ile Gridview’de Çoktan Çoğa İlişki konusunu ele alacağız.

Yazımızın giriş kısmında kısaca Entity Framework’ten bahsederken, ADO.NET kullanımı yerine ADO.NET Entity Framework kullanımının avantajlarına değinmek istiyorum. Entity Framework; kabaca Oluşturma(Create),Okuma(Read),Güncelleme(Update) ve Silme(Delete) işlemlerini gerçekleştirmede gereken eforu yâda çabayı azaltan bir teknolojidir. Yani LINQ ve Entity Framework’ün güçlü yapısı kullanılarak Oluşturma, Okuma, Güncelleme, Silme gibi işlemleri herhangi bir sorgu yazmadan bu işlemleri gerçekleştirmemize olanak tanıyan bir yapıdır.

Entity Framework’ün avantajlarını uygulamalarımızda kullanmak için .edmx uzantılı bir dosyayı uygulamamıza gerekli Table ve Procedureleri import ederek dahil edebiliriz.Dahil etme işlemini gerçekleştirdikten sonra bu ilişkilere dayanan kodlar otomatik olarak oluşturulur.

Amaç ise; Veri tabanlı Uygulamalar için gerekli bakım – onarım ve kod miktarını azaltmaktır. Entity Framework uygulamalarda sağladığı faydaları adım adım göreceğiz.

Haydi başlayalım:

Uygulamamız, Entity Framework ve Linq kullanarak temel işlemleri (Kaydetme, Oluşturma, Silme, Güncelleme… vb) gerçekleştirmek için Many to Many Relation yani çoktan çoğa ilişki yöntemi üzerinde yoğunlaşan örnek bir uygulamadır.

Veritabanımızda 3 tablo oluşturalım: Tablo adlarımız Musteri ,Urun ve MusteriUrun adlarında olsun.

Tablolarımıza ait Database Diagram aşağıdaki gibidir.

Entity Framework ER diagram (Musteri  & Urun arasındaki ilişkiyi göstermektedir(Kod  Model.edmx):

 

Entity Data Modelimizi oluşturduğumuzda designer alanında MusteriUrun tablosunun gizli olduğunu görürüz.(*) ile gösterilen ilişki ise Many to Many yani Çoktan Çoğa ilişkiyi göstermektedir.

Şimdi Entity Framework data modellerimizi oluşturduktan sonra web tarafında Kullanıcı ara yüzünü oluşturarak; gerekli HTML ve Code Behind tarafında C# ile oluşturduğumuz kodlarımızı görelim.

Kullanıcı ara yüzü tarafında hangi metodları kullanacağımıza dair bileşenlerimizi yazacak olursak:

-->Ürün Ekle
-->Müşteri Ekle
-->Güncelle
-->Sil

Gibi detayları Gridview’te gösterilmesini sağlayacak metodlarımızı yazacağımız bileşenler idi.



 

Yukarıdaki gördüğümüz ekran görüntüsünde, Uygulamamıza ait web sayfasının kullanıcı ara yüzü form görünümüdür. Şimdi bu adımları gerçekleştirecek tasarım sayfamızın kaynak kodlarını (default.aspx) ve Code behind C# kodlarımızı adım adım yazarak açıklamalarda bulunalım.

Öncelikle  default.aspx.sayfamıza ait kodlarımızı verecek olursak;

default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" CodeBehind="Default.aspx.cs" Inherits="_Default" %>

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

</script>

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

    <title></title>

</head>

<body>

    <form id="form1" runat="server">

    <div>

    <asp:Label runat="server" ID="lblMesaj" ForeColor="Red"></asp:Label>

        <br />

        <br />

    <asp:Panel runat="server" ID="Pnl" BorderStyle="None" GroupingText="Ürün Ekle">

        <table>

            <tr>

                <td align="right">

                    Ürün Adı&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

                </td>

                <td>

                    <asp:TextBox runat="server" ID="txtUrun" EnableViewState="false" />

                    <asp:RequiredFieldValidator runat="server" ID="GerekliUrunAdi" ControlToValidate="txtUrun"

                        ErrorMessage="Ürün Adı Gereklidir." ValidationGroup="UrunEkle" ForeColor="Red"></asp:RequiredFieldValidator>

                </td>

            </tr>

            <tr>

                <td>

                    &nbsp;</td>

                <td align="left">

                    <asp:Button ID="btnUrun" Text="Ürün Ekle" runat="server" OnClick="btnUrun_Click"

                        ValidationGroup="UrunEkle" />

                </td>

            </tr>

        </table>

    </asp:Panel>

    <br />

    <br />

    <br />

    <asp:Panel runat="server" ID="Panel1" BorderStyle="None" GroupingText="Müşteri Ekle">

        <table>

            <tr>

                <td align="right">

                    Müşteri Adı

                </td>

                <td>

                    <asp:TextBox ID="txtMusteri" runat="server" EnableViewState="false" />

                    <asp:RequiredFieldValidator runat="server" ID="ReqCus" ControlToValidate="txtMusteri"

                        ErrorMessage="Müşteri Adı Gereklidir." ValidationGroup="MusteriEkle" ForeColor="Red"></asp:RequiredFieldValidator>

                </td>

            </tr>

            <tr>

                <td align="right">

                    Select Product

                </td>

                <td>

                    <asp:DropDownList runat="server" ID="drpUrun" AppendDataBoundItems="true"

                        Width="127px">

                        <asp:ListItem Value="">--Seçiniz--</asp:ListItem>

                    </asp:DropDownList>

                    &nbsp;<asp:RequiredFieldValidator runat="server" ID="GerekliUrun" ControlToValidate="drpUrun"

                        ErrorMessage="Lütfen Ürün Adını Seçiniz." ValidationGroup="MusteriEkle" ForeColor="Red"></asp:RequiredFieldValidator>

                </td>

            </tr>

            <tr>

                <td>

                </td>

                <td align="left">

                    <asp:Button ID="btnMusteri" Text="Müşteri Ekle" runat="server" OnClick="btnMusteri_Click"

                        ValidationGroup="MusteriEkle" />

                </td>

            </tr>

        </table>

    </asp:Panel>

    <br />

    <br />

    <br />

    <asp:Panel runat="server" ID="Panel2" BorderStyle="None" GroupingText="Müşteri & Ürün Detayları">

        <table>

            <tr>

                <td align="left">

                    <asp:GridView runat="server" ID="grdDetaylar"

                        OnRowDeleting="grdDetaylar_RowDeleting"

                        OnRowEditing="grdDetaylar_RowEditing"

                        OnRowUpdating="grdDetaylar_RowUpdating"

                        OnRowCancelingEdit="grdDetaylar_RowCancelingEdit"

                        AutoGenerateColumns="false" onrowdatabound="grdDetaylar_RowDataBound"

                        onselectedindexchanged="grdDetaylar_SelectedIndexChanged"   >

                        <Columns>

                                                      

                              <asp:TemplateField>

                                <HeaderTemplate>

                                    Müşteri ID

                                </HeaderTemplate>

                                <ItemTemplate>

                                <asp:Label runat="server" ID="lblMusteriID" Text='<%# Eval("MusteriID") %>'    ></asp:Label>

                                </ItemTemplate>

                            </asp:TemplateField>

 

                            <asp:BoundField DataField="MusteriAdi" HeaderText="Müşteri Adı" NullDisplayText="Bu Alan Gereklidir." />

                         

 

 

                              <asp:TemplateField>

                                <HeaderTemplate>

                                    Ürün ID

                                </HeaderTemplate>

                                <ItemTemplate>

                                <asp:Label runat="server" ID="lblUrunID" Text='<%# Eval("UrunID") %>' ></asp:Label>

                                </ItemTemplate>

                            </asp:TemplateField>

 

 

                            <asp:TemplateField>

                                <HeaderTemplate>

                                    Ürün Adı

                                </HeaderTemplate>

                                <ItemTemplate>

                                      <asp:DropDownList runat="server" ID="drpUrun1" AppendDataBoundItems="true" Enabled="false">

                                        <asp:ListItem Value="">--Seçiniz--</asp:ListItem>

                                     </asp:DropDownList>

                                </ItemTemplate>

                            </asp:TemplateField>

                            <asp:CommandField ShowEditButton="true" ShowCancelButton="true" ShowDeleteButton="true"

                                CancelText="İptal" DeleteText="Sil" UpdateText="Güncelle" HeaderText="Eylemler" />

                        </Columns>

                        <EmptyDataTemplate>

                            Müşteri Yok & Ürün Detayları Mevcuttur.</EmptyDataTemplate>

                    </asp:GridView>

                </td>

            </tr>

        </table>

    </asp:Panel>

       </div>

    </form>

</body>

</html>

 

 

 

Evet, arkadaşlar. aspx sayfamızın tasarım kodlarını vermiş olduk. Kullandığımız bileşenleri ise burada rahatlıkla görebilirsiniz.

Code Behin Tarafına geçmeden önce; projemize bir Entity Data Model ekleyelim. Solution Explorer’da projemizin üzerine Sağ Click -->Add New Item yolunu izleyerek karşımıza çıkan aşağıdaki pencerede ki gibi ADO.NET Entity Data Model ekliyoruz.( Model.edmx) isminde olsun.

 

Oluşturduğumuz Model.edmx ismindeki Data Modelimize ilgili tablolarımızı seçtikten sonra Designer alanında aşağıdaki gibi  ER diyagramımız oluşacaktır. Çoktan Çoğa (Many to Many) ilişkisini gösteren bir ER diyagramdır.

 

 

Global Sınıfımız için gerekli nesneleri oluşturmadan önce Code Behin tarafında Data modelimize otomatik olarak eklenen Veritabanı işlemleri ve nesnelerimizi görelim. Oluşturduğumuz Data Modelimiz, projemiz içine App_Code/Model.edmx olarak kaydedilmektedir. Yani App_Code klasörünün altında bir Model.edmx olarak kaydedilmektedir. Model.edmx.designer  kodlarına baktığımız zaman şu yapıda otomatik olarak oluşturulmuş kodlarımız mevcuttur.

 

Designer alanındaki namespace yani isim uzayları;

using System;

using System.Data.Objects;

using System.Data.Objects.DataClasses;

using System.Data.EntityClient;

using System.ComponentModel;

using System.Xml.Serialization;

using System.Runtime.Serialization;
 

 

 

Şeklindedir.

Ve bu yapıda kodları görebilmekteyiz:


 

Şimdi buraya kadar anlaşılmayan bir durum yoktur. Birçoğunuz şunu soracaksınız, niçin designer tarafındaki kodları görüntüledik? Bu sorunun cevabı yine bu sayfayı görüntülediğimizde kodlara baktığımız anda göze çarpmaktadır.

Görüldüğü gibi;  (NamespaceName="DenemeModel", Name="Musteri") Code behind sayfamızda kodlarla çalışırken isim uzayına yani namespace alanına;

  

using DenemeModel;  eklemeyi unutmuyoruz.

 

Web.Config dosyasında ise otomatik olarak veritabanı işlemleri için oluşturulan ConnectionString’ imiz ise aşağıdaki yapıdadır.

 


 

 

Web.Config dosyamızda otomatik olarak oluşturulan Bağlantı Cümlemizi şekildeki gibi bir yapıya sahip olduğunu görmekteyiz.

 

Global Sınıfımızda nesnemizi oluştururken DenemeEntities1 kullanacağız.

Default.aspx.cs code behind sayfamızda default olarak verilen isim uzaylarımıza ek olarak eklememiz gereken isim uzayları  şunlardır:

 

 

using System.Data.SqlClient;

using System.Data.EntityClient;

using System.Configuration;

using DenemeModel;
 

 

 

 

 

Şimdi Code Behind tarafında C# programlama dilini kullanarak kodlamamıza geçebiliriz.

Global Sınıfımızda bir edmx nesnesi oluşturarak başlayalım. Nesnemiz ;

 

 

DenemeEntities1 entityFramework = new DenemeEntities1();
 

 

 


Şeklinde olacaktır.

Nesnemizi oluşturduktan sonra yapmamız gereken, Ürün Ekle butonunun Click olayına şu kodlarımızı yazmamız gerekir.

 

Kodlarımız üzerindeki açıklama satırlarını okuyarak ne görevde bulunduğunu görebilirsiniz.Yazımızın başında da belirttiğim gibi konunun çok iyi anlaşılabilmesi için kesinlikle Linq konusuna bakmalısınız. Çünkü Entity Framework ,Linq ile birlikte gelen bir yapıdır.

Yukarıda ki btnUrun_click() olayına yazdığımız kodlarımızda önce bir Urun Class’ımız için bir nesne oluşturduk ve UrunAdi özelliğini ayarladık. Son olarak Urun objemizi EDMX objemize ekledik. (Çoktan çoğa İlişki)

Şayet kod bloklarımızda bir hata var ise Bunu Try ,Catch metodunu kullanarak yakalayabiliriz ve hatayı lblMesaj’a yazdırıyoruz.

  • Bir sonraki adımımız:

Müşteri Ekle butonunun Click() olayına yazacağımız kodlar vasıtasıyla Müşterimizi Ekliyoruz.

 

Musteri Class’ına bir nesne oluşturuyoruz. Ve Urun koleksiyonundan dropdown UrunID ‘ye dayalı tek bir Urun nesnesi alıyoruz. Ve Musteri nesnesine Urun ekliyoruz.

 

Basit olarak,Musteri nesnesine bütün koleksiyon detaylarını ekliyor ve son olarak Edmx nesnesine Musteri nesnemizi ekliyoruz. ( Many to Many). Ve ardından

 

NOT:

-----------------------------------------------------------------------------------------------------------------------------------

Burada MusteriUrun tablosuna kayıt işlemleri için herhangi bir Insert kodu yazılmasına gerek yoktur. Entity Framework otomatik olarak bu işlemi ilişkili kayıt için gerçekleştirmektedir.

-----------------------------------------------------------------------------------------------------------------------------------

 

  • Sonraki adımımız ise

            Müşteri Detaylarını ve müşterinin ilişkili olduğu Ürünlerin detaylarını çekerek Data Gridview’de gösterme işlemi olacak.

NOT:

Burada iki tablo arasında herhangi bir JOIN veya diğer koşulları sağlamaya yönelik kod yazmaya gerek yoktur. Bu biraz      daha zor bir yapı olmasına karşın, düzenli birleştirme işlemlerinden biraz farklı bir metotdur.

 

 

  • Diğer işlemlere ait kodlarımız ise aşağıdaki gibidir.

 

Bu işlemler ise Data Gridview  & Binding ait kodlardır.

 

 

 

 

 

 

 

Örnek uygulamamıza ilişkin Ekran çıktısı ise şekildeki gibidir:

 

 

Örnek Projeyi indirmek için tıklayınız.

Projemizi bu linkten Proje Download edebilirsiniz.

 

Bugünlükte bizden bu kadar diyor ve makalemizin sonuna gelmiş bulunuyoruz. Kafanıza takılan soru işaretleri var ise mail yoluyla sorularınızı iletebilirsiniz.

Yazılım ve Programlama aşkı ile tutuştuğumuz bir sonraki yazımızda görüşmek dileğiyle.

Saygılarımla;

Muhammed ÖNAL
Computer & Embedded Systems Engineer
Copyright © Muhammed ÖNAL , 2012


E-mail

 muhammed.onal23@gmail.com

muhammedonal@hotmail.com.tr

 

Facebook

http://www.facebook.com/muhammedhazar.onal/