Aracılığıyla paylaş


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

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.

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/

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.

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 C# sınıfı oluşturur. MoviesDBModel'i açarak bu sınıfları görüntüleyebilirsiniz. Çözüm Gezgini penceresinden Tasarım Aracı.cs dosyasını seçin.

Tasarım Aracı.cs dosyasındaki kodu değiştirmeyin çünkü Entity Tasarım Aracı bir sonraki kullanışınızda değişikliklerinizin üzerine yazılacaktır. Tasarım Aracı.cs 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.cs

using System.Linq;
using System.Web.Mvc;
using MovieEntityApp.Models;

namespace MovieEntityApp.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        MoviesDBEntities _db;

        public HomeController()
        {
            _db = new MoviesDBEntities();
        }

        public ActionResult Index()
        {
            ViewData.Model = _db.MovieSet.ToList();
            return View();
        }

    }
}

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.

Giriş denetleyicisindeMoviesDBEntities sınıfını kullanmak için MovieEntityApp.Models ad alanını (MVCProjectName) içeri aktarmanız gerekir. Modeller).

_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 film nesnelerinin (List<Movie>) genel bir koleksiyonuna 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="C#"  
  Inherits="System.Web.Mvc.ViewPage<List<MovieEntityApp.Models.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>
    
<% foreach (var m in ViewData.Model)
   { %>

    Title: <%= m.Title %>
    <br />
    Director: <%= m.Director %>
    <br />
    <%= Html.ActionLink("Edit", "Edit", new { id = m.Id })%>
    <%= Html.ActionLink("Delete", "Delete", new { id = m.Id })%>
       
        <hr />
<% } %>

<%= 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 foreach 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ü, Model özelliğini Film nesnelerinin (Liste<Filmi) kesin olarak belirlenmiş genel bir Liste koleksiyonuna dönüştüren Inherits özniteliğine sahip bir %@ Sayfa %> yönergesi içerir<.

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.cs (Yöntem ekleme)

public ActionResult Add()
{
    return View();
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Add(FormCollection form)
{
    var movieToAdd = new Movie();

    // Deserialize (Include white list!)
    TryUpdateModel(movieToAdd, new string[] { "Title", "Director" }, form.ToValueProvider());

    // Validate
    if (String.IsNullOrEmpty(movieToAdd.Title))
        ModelState.AddModelError("Title", "Title is required!");
    if (String.IsNullOrEmpty(movieToAdd.Director))
        ModelState.AddModelError("Director", "Director is required!");

    // If valid, save movie to database
    if (ModelState.IsValid)
    {
        _db.AddToMovieSet(movieToAdd);
        _db.SaveChanges();
        return RedirectToAction("Index");
    }

    // Otherwise, reshow form
    return View(movieToAdd);
}

İ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.cs (Yöntemleri düzenle)

public ActionResult Edit(int id)
{
    // Get movie to update
    var movieToUpdate = _db.MovieSet.First(m => m.Id == id);

    ViewData.Model = movieToUpdate;
    return View();
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(FormCollection form)
{
    // Get movie to update
    var id = Int32.Parse(form["id"]);
    var movieToUpdate = _db.MovieSet.First(m => m.Id == id);

    // Deserialize (Include white list!)
    TryUpdateModel(movieToUpdate, new string[] { "Title", "Director" }, form.ToValueProvider());

    // Validate
    if (String.IsNullOrEmpty(movieToUpdate.Title))
        ModelState.AddModelError("Title", "Title is required!");
    if (String.IsNullOrEmpty(movieToUpdate.Director))
        ModelState.AddModelError("Director", "Director is required!");

    // If valid, save movie to database
    if (ModelState.IsValid)
    {
        _db.SaveChanges();
        return RedirectToAction("Index");
    }

    // Otherwise, reshow form
    return View(movieToUpdate);
}

İ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:

var movieToUpdate = _db.MovieSet.First(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="C#" 
  Inherits="System.Web.Mvc.ViewPage<MovieEntityApp.Models.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>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.cs (Silme eylemi)

public ActionResult Delete(int id)
{
    // Get movie to delete
    var movieToDelete = _db.MovieSet.First(m => m.Id == id);

    // Delete 
    _db.DeleteObject(movieToDelete);
    _db.SaveChanges();

    // Show Index view
    return RedirectToAction("Index");
}

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, veritabanı tablosundan bir dizi veritabanı kaydını 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.