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

Microsoft tarafından

Bu eğitimde, Microsoft Entity Framework ile ASP.NET MVC'yi nasıl kullanacağınızı öğrenirsiniz. ADO.NET varlık veri modeli oluşturmak için Varlık Sihirbazı'nı nasıl kullanacağınızı öğrenirsiniz. Bu öğretici boyunca, Varlık Çerçevesi'ni kullanarak veritabanı verilerinin nasıl seçil, eklen, güncelleştirilip silinileceklerini gösteren bir web uygulaması oluşturuyoruz.

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 öğretici, Microsoft Entity Framework hakkında daha önce hiçbir bilgi edinmez. Bu öğreticinin sonunda, veritabanı kayıtlarını seçmek, eklemek, güncelleştirmek ve silmek için Varlık Çerçevesi'ni nasıl kullanacağınızı anlamış olursunuz.

Microsoft Entity Framework, veritabanından otomatik olarak veri erişim katmanı oluşturmanıza olanak tanıyan bir Nesne İlişkisel Eşleme (O/RM) aracıdır. Varlık Çerçevesi, veri erişim sınıflarınızı elle oluşturma zahmetli çalışmalarından kaçınmanızı sağlar.

Note

ASP.NET MVC ile Microsoft Entity Framework arasında önemli bir bağlantı yoktur. Varlık Çerçevesi'nin ASP.NET MVC ile kullanabileceğiniz çeşitli alternatifler vardır. Örneğin, MVC Model 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'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 görüntülemenizi sağlayan bir Film Veritabanı uygulaması oluştururuz.

Bu öğretici, Service Pack 1 ile Visual Studio 2008 veya Visual Web Developer 2008 sahip olduğunu varsayar. Varlık Çerçevesini kullanmak için Servis Paketi 1'e ihtiyacınız var. Visual Studio 2008 Service Pack 1 veya Visual Web Developer'ı Service Pack 1 ile aşağıdaki adresten indirebilirsiniz:

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

Film Örnek 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ü Nulls'a izin mi ver? Birincil Anahtar mı?
Kimlik int False True
Başlık nvarchar(100) False False
Yönetmen nvarchar(100) False False

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

  1. Çözüm Gezgini_penceresindeki Uygulama Verileri klasörüne sağ tıklayın ve Ekle, Yeni Öğe seçeneğini seçin.
  2. Yeni Öğe Ekle iletişim kutusundan SQL Server Database'iseçin, veritabanına MoviesDB.mdf adını verin ve Ekle düğmesini tıklatın.
  3. Server Explorer/Database Explorer penceresini açmak için MoviesDB.mdf dosyasını çift tıklatın.
  4. MoviesDB.mdf veritabanı bağlantısını genişletin, Tablolar klasörüne sağ tıklayın ve Yeni Tablo Ekleseçeneğini seçin.
  5. Tablo Tasarımcısı'na Kimlik, Başlık ve Yönetmen sütunlarını ekleyin.
  6. Filmler adlı yeni tabloyu kaydetmek için Kaydet düğmesini (disket simgesi vardır) tıklatın.

Filmler veritabanı tablosunu oluşturduktan sonra, tabloya bazı örnek veriler eklemeniz gerekir. Filmler tablosuna sağ tıklayın ve Tablo Verilerini Göstermenüsü seçeneğini seçin. Görünen ızgaraya sahte film verileri girebilirsiniz.

ADO.NET Varlık Veri Modeli oluşturma

Varlık Çerçevesini kullanmak için bir Varlık Veri Modeli oluşturmanız gerekir. Bir veritabanından otomatik olarak bir Varlık Veri Modeli oluşturmak için Visual Studio Entity Data Model Wizard'dan yararlanabilirsiniz.

Şu adımları uygulayın:

  1. Çözüm Gezgini penceresindeki Modeller klasörüne sağ tıklayın ve Ekle, Yeni Öğeseçeneğini seçin.
  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üğmesini tıklatın. Ekle düğmesini tıklattığınızda Veri Modeli Sihirbazı başlatın.
  4. Model İçeriği Seç adımında, veritabanından Oluştur seçeneğini seçin ve Sonraki düğmesini tıklatın (Bkz. Şekil 2).
  5. Veri Bağlantınızı Seçin adımda, MoviesDB.mdf veritabanı bağlantısını seçin, varlıklar bağlantı ayarları adı MoviesDBEntities'ı girin ve Sonraki düğmesini tıklatın (Bkz. Şekil 3).
  6. Veritabanı Nesnelerinizi Seç adımında, Film veritabanı tablosunu seçin ve Finish düğmesini tıklatın (Bkz. Şekil 4).

Bu adımları tamamladıktan sonra, varlık veri modeli tasarımcısı (Entity Designer) ADO.NET açılır.

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

clip_image002

Şekil 2 – Model İçerikleri Adım Seçin

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 Modelinin Değiştirilmesi

Bir Varlık Veri Modeli oluşturduktan sonra, Varlık Tasarımcısı'ndan yararlanarak modeli değiştirebilirsiniz (Bkz. Şekil 5). Çözüm Gezgini penceresindeki Modeller klasöründe yer alan MoviesDBModel.edmx dosyasını çift tıklatarak 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. Bu sınıfı belirli bir Film örneğini temsil etmek için kullanacağımızdan, sınıfı Filmler'den Filme yeniden adlandırmalıyız.

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

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

clip_image012

Kaydet düğmesini (disketsimgesi) tıklatarak bir değişiklik yaptıktan sonra Varlık Veri Modelinizi kaydetmeyi unutmayın. Arka planda, Varlık Tasarımcısı Visual Basic .NET sınıfları kümesi oluşturur. Bu sınıfları Solution Explorer penceresinden MoviesDBModel.Designer.vb dosyasını açarak görüntüleyebilirsiniz.

Değişiklikleriniz Entity Designer'ı bir sonraki kullanımınızda üzerine yazılanın acağı için 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.

Varlık Çerçevesi 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 Ev denetleyicisi Index() adlı bir eylemi ortaya çıkarır. Index() eylemi, Varlık Çerçevesi'nden yararlanarak film veritabanı tablosundaki tüm film kayıtlarını döndürür.

Listeleme 1 – Denetleyiciler\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

Listeleme 1'deki denetleyicinin bir oluşturucu içerdiğine dikkat edin. Oluşturucu db adlı sınıf düzeyinde _bir alan başlatılmasını. db alanı, _Microsoft Entity Framework tarafından oluşturulan veritabanı varlıklarını temsil eder. _db alanı, Entity Designer tarafından oluşturulan MoviesDBEntities sınıfının bir örneğidir.

DB alanı, _Filmler veritabanı tablosundaki kayıtları almak için Index() eylemi içinde kullanılır. Db _ifadesi. MovieSet, Filmler veritabanı tablosundaki tüm kayıtları temsil eder. ToList() yöntemi, film kümesini film nesnelerinin genel bir koleksiyonuna dönüştürmek için kullanılır: List (Film Listesi).

Film kayıtları LINQ'dan Varlıklara yardımıyla alınır. Listeleme 1'deki Dizin() eylemi, veritabanı kayıtları kümesini almak için LINQ yöntemi sözdizimini kullanır. İsterseniz, bunun yerine LINQ sorgu sözdizimini kullanabilirsiniz. Aşağıdaki iki ifadeler çok aynı şeyi yapmak:

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özdizimi veya sorgu sözdizimi) hangisinde kullanın. İki yaklaşım arasında performans farkı yoktur – tek fark stildir.

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

Listeleme 2 – Görünümler\Ana Sayfa\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>

Listeleme 2'deki görünüm, her film kaydında her döngüyü kaydeden 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 alt kısmında Film Ekle bağlantısı görünür (Bkz. Şekil 7).

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

clip_image014

Dizin görünümü yazılıbir görünümdür. Dizin görünümünde, Devralma özniteliği içeren %@ <Sayfa %> yönergesi vardır. Devralınan öznitelik ViewData.Model özelliğini film nesnelerinin güçlü bir şekilde yazılan genel Liste koleksiyonuna - bir Liste(Film Listesi) atar.

Veritabanı Kayıtlarını Varlık Çerçevesine Ekleme

Veritabanı tablosuna yeni kayıtlar eklemeyi kolaylaştırmak için Varlık Çerçevesi'ni kullanabilirsiniz. Listeleme 3, Film veritabanı tablosuna yeni kayıtlar eklemek için kullanabileceğiniz Ev denetleyicisi sınıfına eklenen iki yeni eylem içerir.

Listeleme 3 – Denetleyiciler\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 Ekle() 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ğiniz zaman, ikinci Add() eylemi çağrılır.

İkinci Add() eyleminin AcceptVerbs özniteliği yle süslenmiş olduğuna dikkat edin. Bu eylem yalnızca bir HTTP POST işlemi gerçekleştirirken çağrılabilir. Başka bir deyişle, bu eylem yalnızca bir HTML formu gönderirken çağrılabilir.

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

Varlık Çerçevesi'ni kullanırken, bir varlık sınıfının özelliklerini güncelleştirmek için TryUpdateModel veya UpdateModel yöntemlerini kullanırken özelliklerin bir "beyaz listesini" sağlamanız gerekir.

Ardından, Ekle() eylemi bazı basit form doğrulama gerçekleştirir. Eylem, hem Başlık hem de Yönetici özelliklerinin değerleri olduğunu doğrular. Bir doğrulama hatası varsa, ModelState'e bir doğrulama hatası iletisi eklenir.

Doğrulama hatası yoksa, Varlık Çerçevesi 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()

Kodun ilk satırı, Varlık Çerçevesi tarafından izlenen film kümesine yeni Film varlığını ekler. İkinci kod satırı, temel veritabanına kadar izlenen Filmler'de yapılan değişikliklerden ne olursa olsun kaydeder.

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

clip_image016

Veritabanı Kayıtlarını Varlık Çerçevesi ile Güncelleştirme

Yeni bir veritabanı kaydı eklemek için izlediğimiz yaklaşım olarak Varlık Çerçevesi ile bir veritabanı kaydını yeniden oluşturmak için hemen hemen aynı yaklaşımı uygulayabilirsiniz. Listeleme 4, Edit() adlı iki yeni denetleyici eylemi içerir. İlk Edit() eylemi, bir 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 – Denetleyiciler\HomeController.vb (Yöntemleri edin)

<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 Ntities deyimi, belirli bir Id ile eşleşen ilk veritabanı kaydını kaplar:

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

Daha sonra, TryUpdateModel() yöntemi, HTML form alanlarının değerlerini film varlığının özelliklerine atamak için kullanılır. Güncelleştirilen tam özellikleri belirtmek için beyaz bir liste sağlandığına dikkat edin.

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. Her iki özellikte de bir değer eksikse, ModelState'e bir doğrulama hatası iletisi eklenir ve ModelState.IsValid değeri yanlış döndürür.

Son olarak, doğrulama hatası yoksa, temel Filmler veritabanı tablosu SaveChanges() yöntemini arayarak 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 eylem altta yatan veritabanında güncelleştirmek için hangi kayıt bilemez. Listeleme 5'te yer alan Düzenle görünümü, düzenlenen veritabanı kaydının Kimliğini temsil eden gizli bir form alanı içerir.

Listeleme 5 – Görünümler\Ana Sayfa\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>

Veritabanı Kayıtlarını Varlık Çerçevesi ile Silme

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

Listeleme 6 -- \Controllers\HomeController.vb (Eylemi sil)

<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

Sil() eylemi önce eyleme geçen Id ile eşleşen Film varlığını alır. Daha sonra film, DeleteObject() yöntemini ve ardından SaveChanges() yöntemini arayarak 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ı nasıl oluşturabileceğinizi göstermekti. Veritabanı kayıtlarını seçmenizi, eklemenizi, güncelleştirmenizi ve silmenizi sağlayan bir uygulamayı nasıl oluşturabileceğinizi öğrendiniz.

İlk olarak, Visual Studio içinden bir Varlık Veri Modeli oluşturmak için Varlık Veri Modeli Sihirbazı'nı nasıl kullanabileceğinizi tartıştık. Ardından, bir veritabanı tablosundan bir veritabanı kaydı kümesi almak için LINQ to Ntities'ı nasıl kullanacağınızı öğrenirsiniz. Son olarak, veritabanı kayıtlarını eklemek, güncelleştirmek ve silmek için Varlık Çerçevesi'ni kullandık.