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 önceden bilgi sahibi 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, MVC Modeli sınıflarınızı Microsoft LINQ to SQL, NHibernate veya SubSonic gibi diğer O/RM araçlarını kullanarak oluşturabilirsiniz.

Microsoft Entity Framework'i ASP.NET MVC ile nasıl kullanabileceğinizi 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

Film Veritabanı 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 penceresinde 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ı'nı 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ım Aracı 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, Varlıklar bağlantı ayarları adını MoviesDBEntities 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ım Aracı (Varlık Tasarım Aracı) 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çme

clip_image008

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

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

Şekil 5 – ADO.NET Varlık Veri Modeli Tasarım Aracı

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ım Aracı 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 olarak yeniden adlandırmamız gerekir.

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

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

clip_image012

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

Entity Tasarım Aracı bir sonraki kullanımınızda değişikliklerinizin üzerine yazılacağından Tasarım Aracı.vb dosyasındaki kodu değiştirmeyin. Tasarım Aracı.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. Liste 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ı bir sınıf düzeyi alanı başlatır. _db alanı, Microsoft Entity Framework tarafından oluşturulan veritabanı varlıklarını temsil eder. _db alanı, Entity Tasarım Aracı 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. Dilerseniz 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öz dizimlerini (yöntem söz dizimi veya sorgu söz dizimi) kullanın. İki yaklaşım arasında 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 For Each döngüsünü 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ğini içeren bir <%@ Sayfa %> yönergesi var. Inherits özniteliği ViewData.Model özelliğini film nesnelerinin kesin olarak belirlenmiş genel bir List koleksiyonuna (Bir List(Of Movie) atar.

Entity Framework ile Veritabanı Kayıtları Ekleme

Entity Framework'i kullanarak veritabanı tablosuna yeni kayıtlar eklemeyi kolaylaştırabilirsiniz. Liste 3, Film 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 ekleme)

<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 donatıldığını göreceksiniz. Bu eylem yalnızca bir 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 bazı basit form doğrulama işlemleri 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 aşağıdaki iki kod satırıyla veritabanına eklenir:

_db.AddToMovieSet(movieToAdd)
_db.SaveChanges()

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

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

clip_image016

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

Yeni bir veritabanı kaydı eklemek için izlediğimiz yaklaşımla, Entity Framework ile veritabanı kaydını düzenlemek için 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ştirmeyi dener.

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ğrulama gerçekleştirilir. Herhangi bir özellikte değer eksikse, ModelState'e bir doğrulama hata iletisi eklenir ve ModelState.IsValid false değerini döndürür.

Son olarak, doğrulama hatası yoksa, temel alınan 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.

Listeleme 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.

Listeleme 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ı, MVC ve Microsoft Entity Framework'ASP.NET 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 veritabanı kayıtları kümesi 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.