Entity Framework ile Model Sınıfları Oluşturma (VB)

Microsoft tarafından

Bu öğreticide ASP.NET MVC'yi Microsoft Entity Framework ile kullanmayı öğreneceksiniz. Varlık Sihirbazı'nı kullanarak ADO.NET Varlık Veri Modeli oluşturmayı öğreneceksiniz. Bu öğretici boyunca Entity Framework kullanarak veritabanı verilerinin nasıl seçildiğini, eklendiğini, güncelleştirildiğini ve silindiğini gösteren bir web uygulaması oluşturacağız.

Bu öğreticinin amacı, bir ASP.NET MVC uygulaması oluştururken Microsoft Entity Framework kullanarak veri erişim sınıflarını nasıl oluşturabileceğinizi açıklamaktır. Bu öğreticide, Microsoft Entity Framework hakkında daha önce bilgi olmadığı varsayılır. Bu öğreticinin sonunda, veritabanı kayıtlarını seçmek, eklemek, güncelleştirmek ve silmek için Entity Framework'ün nasıl kullanılacağını anlayacaksınız.

Microsoft Entity Framework, veritabanından otomatik olarak veri erişim katmanı oluşturmanızı sağlayan bir Nesne İlişkisel Eşleme (O/RM) aracıdır. Entity Framework, veri erişim sınıflarınızı el ile oluşturma zahmetli çalışmalarından kaçınmanızı sağlar.

Not

ASP.NET MVC ile Microsoft Entity Framework arasında temel bir bağlantı yoktur. Entity Framework'e ASP.NET MVC ile kullanabileceğiniz çeşitli alternatifler vardır. Örneğin, Microsoft LINQ to SQL, NHibernate veya SubSonic gibi diğer O/RM araçlarını kullanarak MVC Modeli sınıflarınızı oluşturabilirsiniz.

Microsoft Entity Framework'ün ASP.NET MVC ile nasıl kullanılacağını göstermek için basit bir örnek uygulama oluşturacağız. Film veritabanı kayıtlarını görüntülemenizi ve düzenlemenizi sağlayan bir Film Veritabanı uygulaması oluşturacağız.

Bu öğreticide Visual Studio 2008 veya Visual Web Developer 2008 Service Pack 1'e sahip olduğunuz varsayılır. Entity Framework'ün kullanılabilmesi için Service Pack 1 gerekir. Visual Studio 2008 Service Pack 1 veya Visual Web Developer with Service Pack 1'i aşağıdaki adresten indirebilirsiniz:

https://www.asp.net/downloads/

Film Örneği Veritabanı Oluşturma

Movie Database uygulaması, aşağıdaki sütunları içeren Filmler adlı bir veritabanı tablosu kullanır:

Sütun Adı Veri Türü Null'lara izin velsin mi? Birincil Anahtar mı?
Id int Yanlış Doğru
Başlık nvarchar(100) Yanlış Yanlış
Yönetmen nvarchar(100) Yanlış Yanlış

Aşağıdaki adımları izleyerek bu tabloyu bir ASP.NET MVC projesine ekleyebilirsiniz:

  1. Çözüm Gezgini penceresindeki App_Data klasörüne sağ tıklayın ve Ekle, Yeni Öğe menü seçeneğini belirleyin.
  2. Yeni Öğe Ekle iletişim kutusunda Veritabanı SQL Server seçin, veritabanına MoviesDB.mdf adını verin ve Ekle düğmesine tıklayın.
  3. Sunucu Gezgini/Veritabanı Gezgini penceresini açmak için MoviesDB.mdf dosyasına çift tıklayın.
  4. MoviesDB.mdf veritabanı bağlantısını genişletin, Tablolar klasörüne sağ tıklayın ve Yeni Tablo Ekle menü seçeneğini belirleyin.
  5. Tablo Tasarımcısı'nda Id, Title ve Director sütunlarını ekleyin.
  6. Yeni tabloyu Filmler adıyla kaydetmek için Kaydet düğmesine (disket simgesine sahiptir) tıklayın.

Filmler veritabanı tablosunu oluşturduktan sonra tabloya bazı örnek veriler eklemeniz gerekir. Filmler tablosuna sağ tıklayın ve Tablo Verilerini Göster menü seçeneğini belirleyin. Görüntülenen kılavuza sahte film verileri girebilirsiniz.

ADO.NET Varlık Veri Modeli Oluşturma

Entity Framework'i kullanmak için bir Varlık Veri Modeli oluşturmanız gerekir. Veritabanından otomatik olarak Varlık Veri Modeli oluşturmak için Visual Studio Varlık Veri Modeli Sihirbazı'ndan yararlanabilirsiniz.

Şu adımları izleyin:

  1. Çözüm Gezgini penceresinde Modeller klasörüne sağ tıklayın ve Ekle, Yeni Öğe menü seçeneğini belirleyin.
  2. Yeni Öğe Ekle iletişim kutusunda Veri kategorisini seçin (bkz. Şekil 1).
  3. ADO.NET Varlık Veri Modeli şablonunu seçin, Varlık Veri Modeli'ne MoviesDBModel.edmx adını verin ve Ekle düğmesine tıklayın. Ekle düğmesine tıklanması Veri Modeli Sihirbazı'nı başlatır.
  4. Model İçeriğiNi Seçin adımında Veritabanından oluştur seçeneğini belirleyin ve İleri düğmesine tıklayın (bkz. Şekil 2).
  5. Veri Bağlantınızı Seçin adımında MoviesDB.mdf veritabanı bağlantısını seçin, MoviesDBEntities adlı varlıklar bağlantı ayarları adını girin ve İleri düğmesine tıklayın (bkz. Şekil 3).
  6. Veritabanı Nesnelerinizi Seçin adımında Film veritabanı tablosunu seçin ve Son düğmesine tıklayın (bkz. Şekil 4).

Bu adımları tamamladıktan sonra ADO.NET Varlık Veri Modeli Tasarımcısı (Varlık Tasarımcısı) açılır.

Şekil 1 – Yeni Varlık Veri Modeli Oluşturma

clip_image002

Şekil 2 – Model İçeriğiNi Seçme Adımı

clip_image004

Şekil 3 – Veri Bağlantınızı Seçin

clip_image006

Şekil 4 – Veritabanı Nesnelerinizi Seçin

clip_image008

ADO.NET Varlık Veri Modelini Değiştirme

Varlık Veri Modeli oluşturduktan sonra, Varlık Tasarımcısı'nın avantajlarından yararlanarak modeli değiştirebilirsiniz (bkz. Şekil 5). Çözüm Gezgini penceresindeki Models klasöründe bulunan MoviesDBModel.edmx dosyasına çift tıklayarak Varlık Tasarımcısı'nı istediğiniz zaman açabilirsiniz.

Şekil 5 – ADO.NET Varlık Veri Modeli Tasarımcısı

clip_image010

Örneğin, Varlık Modeli Veri Sihirbazı'nın oluşturduğu sınıfların adlarını değiştirmek için Varlık Tasarımcısı'nı kullanabilirsiniz. Sihirbaz Filmler adlı yeni bir veri erişim sınıfı oluşturdu. Başka bir deyişle, Sihirbaz sınıfa veritabanı tablosuyla aynı adı verdi. Belirli bir Movie örneğini temsil etmek için bu sınıfı kullanacağımızdan, sınıfı Filmler'den Film'e yeniden adlandırmamız gerekir.

Varlık sınıfını yeniden adlandırmak istiyorsanız Varlık Tasarımcısı'nda sınıf adına çift tıklayıp yeni bir ad girebilirsiniz (bkz. Şekil 6). Alternatif olarak, Varlık Tasarımcısı'nda bir varlık seçtikten sonra Özellikler penceresi varlığın adını değiştirebilirsiniz.

Şekil 6 – Varlık adını değiştirme

clip_image012

Değişiklik yaptıktan sonra Kaydet düğmesine (disketin simgesi) tıklayarak Varlık Veri Modelinizi kaydetmeyi unutmayın. Arka planda Varlık Tasarımcısı bir dizi Visual Basic .NET sınıfı oluşturur. Çözüm Gezgini penceresinden MoviesDBModel.Designer.vb dosyasını açarak bu sınıfları görüntüleyebilirsiniz.

Değişiklikleriniz Varlık Tasarımcısı'nı bir sonraki kullanışınızda üzerine yazılacağından Designer.vb dosyasındaki kodu değiştirmeyin. Designer.vb dosyasında tanımlanan varlık sınıflarının işlevselliğini genişletmek istiyorsanız, ayrı dosyalarda kısmi sınıflar oluşturabilirsiniz.

Entity Framework ile Veritabanı Kayıtlarını Seçme

Film kayıtlarının listesini görüntüleyen bir sayfa oluşturarak Film Veritabanı uygulamamızı oluşturmaya başlayalım. Listeleme 1'deki Giriş denetleyicisi Index() adlı bir eylemi kullanıma sunar. Index() eylemi, Entity Framework'ten yararlanarak Film veritabanı tablosundaki tüm film kayıtlarını döndürür.

Listeleme 1 – Controllers\HomeController.vb

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Private _db As MoviesDBEntities

    Public Sub New()
        _db = New MoviesDBEntities()
    End Sub

    Public Function Index()
        ViewData.Model = _db.MovieSet.ToList()
        Return View()
    End Function

End Class

Liste 1'deki denetleyicinin bir oluşturucu içerdiğine dikkat edin. Oluşturucu, _db adlı sınıf düzeyinde bir alan başlatır. _db alanı, Microsoft Entity Framework tarafından oluşturulan veritabanı varlıklarını temsil eder. _db alanı, Varlık Tasarımcısı tarafından oluşturulan MoviesDBEntities sınıfının bir örneğidir.

_db alanı, Filmler veritabanı tablosundaki kayıtları almak için Index() eyleminde kullanılır. İfade _db. MovieSet, Filmler veritabanı tablosundaki tüm kayıtları temsil eder. ToList() yöntemi, film kümesini Movie objects: List( Of Movie) adlı genel bir koleksiyona dönüştürmek için kullanılır.

Film kayıtları LINQ to Entities yardımıyla alınır. Listeleme 1'deki Index() eylemi, veritabanı kayıtları kümesini almak için LINQ yöntemi söz dizimini kullanır. Tercih ederseniz, bunun yerine LINQ sorgu söz dizimlerini kullanabilirsiniz. Aşağıdaki iki deyim aynı şeyi yapar:

ViewData.Model = _db.MovieSet.ToList()
ViewData.Model = (from m in _db.MovieSet select m).ToList()

En sezgisel bulduğunuz LINQ sözdizimini (yöntem söz dizimi veya sorgu söz dizimi) kullanın. İki yaklaşım arasındaki performans farkı yoktur; tek fark stildir.

Liste 2'deki görünüm, film kayıtlarını görüntülemek için kullanılır.

Listeleme 2 – Views\Home\Index.aspx

<%@ Page Language="VB" 
  Inherits="System.Web.Mvc.ViewPage(Of List(Of MvcApplication1.Movie))" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Index</title>
</head>
<body>
    <div>
    
<%  For Each m In Model%>

    Title: <%= m.Title %>
    <br />
    Director: <%= m.Director %>
    <br />
    <%=Html.ActionLink("Edit", "Edit", New With {.id = m.Id})%>
    <%=Html.ActionLink("Delete", "Delete", New With {.id = m.Id})%>
       
        <hr />
<% Next%>
    
    <%= Html.ActionLink("Add Movie", "Add") %>
    
    </div>
</body>
</html>

Liste 2'deki görünüm, her film kaydında yineleyen ve film kaydının Başlık ve Yönetmen özelliklerinin değerlerini görüntüleyen Bir For Each döngüsü içerir. Her kaydın yanında bir Düzenle ve Sil bağlantısının görüntülendiğine dikkat edin. Ayrıca, görünümün en altında Film Ekle bağlantısı görüntülenir (bkz. Şekil 7).

Şekil 7 – Dizin görünümü

clip_image014

Dizin görünümü , yazılan bir görünümdür. Dizin görünümünde Inherits özniteliği içeren bir <%@ Sayfa %> yönergesi var. Inherits özniteliği ViewData.Model özelliğini, Movie nesnelerinin (List(Of Movie) kesin olarak belirlenmiş genel bir List koleksiyonuna atar.

Entity Framework ile Veritabanı Kayıtları Ekleme

Veritabanı tablosuna yeni kayıtlar eklemeyi kolaylaştırmak için Entity Framework'i kullanabilirsiniz. Liste 3, Movie veritabanı tablosuna yeni kayıtlar eklemek için kullanabileceğiniz, Giriş denetleyicisi sınıfına eklenen iki yeni eylem içerir.

Listeleme 3 – Controllers\HomeController.vb (Yöntem ekle)

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Public Function Add()
        Return View()
    End Function

    <AcceptVerbs(HttpVerbs.Post)> _
    Public Function Add(ByVal form As FormCollection)
        Dim movieToAdd As New Movie()

        ' Deserialize (Include white list!)
        TryUpdateModel(movieToAdd, New String() {"Title", "Director"}, form.ToValueProvider())

        ' Validate
        If String.IsNullOrEmpty(movieToAdd.Title) Then
            ModelState.AddModelError("Title", "Title is required!")
        End If
        If String.IsNullOrEmpty(movieToAdd.Director) Then
            ModelState.AddModelError("Director", "Director is required!")
        End If

        ' If valid, save movie to database
        If (ModelState.IsValid) Then
            _db.AddToMovieSet(movieToAdd)
            _db.SaveChanges()
            Return RedirectToAction("Index")
        End If

        ' Otherwise, reshow form
        Return View(movieToAdd)
    End Function

End Class

İlk Add() eylemi yalnızca bir görünüm döndürür. Görünüm, yeni bir film veritabanı kaydı eklemek için bir form içerir (bkz. Şekil 8). Formu gönderdiğinizde, ikinci Add() eylemi çağrılır.

İkinci Add() eyleminin AcceptVerbs özniteliğiyle dekore edildiğine dikkat edin. Bu eylem yalnızca HTTP POST işlemi gerçekleştirilirken çağrılabilir. Başka bir deyişle, bu eylem yalnızca html formu gönderildiğinde çağrılabilir.

İkinci Add() eylemi, ASP.NET MVC TryUpdateModel() yönteminin yardımıyla Entity Framework Movie sınıfının yeni bir örneğini oluşturur. TryUpdateModel() yöntemi, Add() yöntemine geçirilen FormCollection içindeki alanları alır ve bu HTML form alanlarının değerlerini Movie sınıfına atar.

Entity Framework kullanırken, varlık sınıfının özelliklerini güncelleştirmek için TryUpdateModel veya UpdateModel yöntemlerini kullanırken özelliklerin "güvenli listesini" sağlamanız gerekir.

Ardından, Add() eylemi basit bir form doğrulaması gerçekleştirir. Eylem, hem Title hem de Director özelliklerinin değerleri olduğunu doğrular. Doğrulama hatası varsa ModelState'e bir doğrulama hata iletisi eklenir.

Doğrulama hatası yoksa, Entity Framework'ün yardımıyla Filmler veritabanı tablosuna yeni bir film kaydı eklenir. Yeni kayıt veritabanına aşağıdaki iki kod satırıyla eklenir:

_db.AddToMovieSet(movieToAdd)
_db.SaveChanges()

İlk kod satırı yeni Movie varlığını Entity Framework tarafından izlenen film kümesine ekler. İkinci kod satırı, Filmler'de yapılan değişiklikleri temel alınan veritabanına geri kaydeder.

Şekil 8 – Ekle görünümü

clip_image016

Entity Framework ile Veritabanı Kayıtlarını Güncelleştirme

Entity Framework ile bir veritabanı kaydını düzenlemek için, yeni bir veritabanı kaydı eklemek için izlediğimiz yaklaşımla neredeyse aynı yaklaşımı izleyebilirsiniz. Liste 4, Edit() adlı iki yeni denetleyici eylemi içerir. İlk Edit() eylemi, film kaydını düzenlemek için bir HTML formu döndürür. İkinci Edit() eylemi veritabanını güncelleştirmeye çalışır.

Listeleme 4 – Controllers\HomeController.vb (Yöntemleri düzenle)

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Public Function Edit(ByVal id As Integer)
        ' Get movie to update
        Dim movieToUpdate As Movie = _db.MovieSet.First(Function(m) m.Id = id)
        ViewData.Model = movieToUpdate
        Return View()
    End Function

    <AcceptVerbs(HttpVerbs.Post)> _
    Public Function Edit(ByVal form As FormCollection)

        ' Get movie to update
        Dim id As Integer = Integer.Parse(form("id"))
        Dim movieToUpdate As Movie = _db.MovieSet.First(Function(m) m.Id = id)

        ' Deserialize (Include white list!)
        TryUpdateModel(movieToUpdate, New String() {"Title", "Director"}, form.ToValueProvider)

        ' Validate
        If String.IsNullOrEmpty(movieToUpdate.Title) Then
            ModelState.AddModelError("Title", "Title is required!")
        End If
        If String.IsNullOrEmpty(movieToUpdate.Director) Then
            ModelState.AddModelError("Director", "Director is required!")
        End If

        ' If valid, save movie to database
        If (ModelState.IsValid) Then
            _db.SaveChanges()
            Return RedirectToAction("Index")
        End If

        ' Otherwise, reshow form
        Return View(movieToUpdate)
    End Function

End Class

İkinci Edit() eylemi, düzenlenen filmin kimliğiyle eşleşen veritabanından Film kaydını alarak başlar. Aşağıdaki LINQ to Entities deyimi, belirli bir kimlikle eşleşen ilk veritabanı kaydını alır:

Dim movieToUpdate As Movie = _db.MovieSet.First(Function(m) m.Id = id)

Ardından, HTML form alanlarının değerlerini film varlığının özelliklerine atamak için TryUpdateModel() yöntemi kullanılır. Güncelleştirilecek tam özellikleri belirtmek için bir güvenli liste sağlandığını görebilirsiniz.

Ardından, hem Film Başlığı hem de Yönetmen özelliklerinin değerleri olduğunu doğrulamak için bazı basit doğrulamalar gerçekleştirilir. Bir özellikte değer eksikse ModelState'e bir doğrulama hata iletisi eklenir ve ModelState.IsValid değeri false döndürür.

Son olarak, doğrulama hatası yoksa, temel filmler veritabanı tablosu SaveChanges() yöntemi çağrılarak tüm değişikliklerle güncelleştirilir.

Veritabanı kayıtlarını düzenlerken, düzenlenen kaydın kimliğini veritabanı güncelleştirmesini gerçekleştiren denetleyici eylemine geçirmeniz gerekir. Aksi takdirde, denetleyici eylemi temel alınan veritabanında hangi kaydın güncelleştirileceğini bilmez. Liste 5'te yer alan Düzenle görünümü, düzenlenmekte olan veritabanı kaydının kimliğini temsil eden gizli bir form alanı içerir.

Liste 5 – Views\Home\Edit.aspx

<%@ Page Language="VB" Inherits="System.Web.Mvc.ViewPage(Of MvcApplication1.Movie)" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>Edit</title>
    <style type="text/css">
    
    .input-validation-error
    {
        background-color:Yellow;
    }
    
    </style>    
</head>
<body>
    <div>

<h1>Edit Movie</h1>

<form method="post" action="/Home/Edit">

    <!-- Include Hidden Id -->
    <%= Html.Hidden("id") %>

    Title:
    <br />
    <%= Html.TextBox("title") %>
    
    <br /><br />
    Director:
    <br />
    <%= Html.TextBox("director") %>
    
    <br /><br />
    <input type="submit" value="Edit Movie" />
</form>
    
    </div>
</body>
</html>

Entity Framework ile Veritabanı Kayıtlarını Silme

Bu öğreticide ele almanız gereken son veritabanı işlemi veritabanı kayıtlarını silmektir. Belirli bir veritabanı kaydını silmek için Listeleme 6'daki denetleyici eylemini kullanabilirsiniz.

Liste 6 -- \Controllers\HomeController.vb (Silme eylemi)

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Public Function Delete(ByVal id As Integer)
        ' Get movie to delete
        Dim movieToDelete As Movie = _db.MovieSet.First(Function(m) m.Id = id)

        ' Delete 
        _db.DeleteObject(movieToDelete)
        _db.SaveChanges()

        ' Show Index view
        Return RedirectToAction("Index")
    End Function

End Class

Delete() eylemi önce eyleme geçirilen kimlikle eşleşen Movie varlığını alır. Ardından film, DeleteObject() yöntemi ve ardından SaveChanges() yöntemi çağrılarak veritabanından silinir. Son olarak, kullanıcı Dizin görünümüne geri yönlendirilir.

Özet

Bu öğreticinin amacı, ASP.NET MVC ve Microsoft Entity Framework'ün avantajlarından yararlanarak veritabanı tabanlı web uygulamaları oluşturmayı göstermekti. Veritabanı kayıtlarını seçmenize, eklemenize, güncelleştirmenize ve silmenize olanak tanıyan bir uygulama oluşturmayı öğrendiniz.

İlk olarak, Visual Studio'dan varlık veri modeli oluşturmak için Varlık Veri Modeli Sihirbazı'nı nasıl kullanabileceğinizi ele aldık. Ardından, bir veritabanı tablosundan bir dizi veritabanı kaydı almak için LINQ to Entities kullanmayı öğreneceksiniz. Son olarak, veritabanı kayıtlarını eklemek, güncelleştirmek ve silmek için Entity Framework'i kullandık.