Aracılığıyla paylaş


Bölüm 4: Modeller ve Veri Erişimi

tarafından Jon Galloway

MVC Müzik Deposu, web geliştirme için ASP.NET MVC ve Visual Studio'yu kullanmayı adım adım tanıtır ve açıklayan bir öğretici uygulamasıdır.

MVC Music Store, müzik albümlerini çevrimiçi olarak satan ve temel site yönetimi, kullanıcı oturum açma ve alışveriş sepeti işlevlerini uygulayan basit bir örnek mağaza uygulamasıdır.

Bu öğretici serisi, ASP.NET MVC Müzik Deposu örnek uygulamasını derlemek için atılan tüm adımların ayrıntılarını içerir. Bölüm 4, Modeller ve Veri Erişimi'ni kapsar.

Şu ana kadar Denetleyicilerimizden Görünüm şablonlarımıza "sahte veriler" geçiriyorduk. Artık gerçek bir veritabanı oluşturmaya hazırız. Bu öğreticide veritabanı altyapımız olarak SQL Server Compact Edition'ın (genellikle SQL CE olarak adlandırılır) nasıl kullanılacağını anlatacağız. SQL CE, herhangi bir yükleme veya yapılandırma gerektirmeyen, yerel geliştirme için gerçekten kullanışlı hale getiren ücretsiz, eklenmiş, dosya tabanlı bir veritabanıdır.

Entity Framework Code-First ile veritabanı erişimi

Veritabanını sorgulamak ve güncelleştirmek için ASP.NET MVC 3 projelerine dahil edilen Entity Framework (EF) desteğini kullanacağız. EF, geliştiricilerin veritabanında depolanan verileri nesne odaklı bir şekilde sorgulamasını ve güncelleştirmesini sağlayan esnek bir nesne ilişkisel eşleme (ORM) veri API'sidir.

Entity Framework sürüm 4, code-first adlı bir geliştirme paradigması destekler. Kod öncelikli, basit sınıflar ("düz eski" CLR nesnelerinden POCO olarak da bilinir) yazarak model nesnesi oluşturmanıza olanak tanır ve hatta sınıflarınızdan anında veritabanı oluşturabilirsiniz.

Model Sınıflarımızdaki Değişiklikler

Bu öğreticide Entity Framework'teki veritabanı oluşturma özelliğinden yararlanacağız. Ancak bunu yapmadan önce model sınıflarımızda daha sonra kullanacağımız bazı şeyleri eklemek için birkaç küçük değişiklik yapalım.

Sanatçı Modeli Sınıflarını Ekleme

Albümlerimiz Sanatçılar ile ilişkilendirileceği için bir Sanatçıyı tanımlamak için basit bir model sınıfı ekleyeceğiz. Aşağıda gösterilen kodu kullanarak Artist.cs adlı Models klasörüne yeni bir sınıf ekleyin.

namespace MvcMusicStore.Models
{
    public class Artist
    {
        public int ArtistId { get; set; }
        public string Name { get; set; }
    }
}

Model Sınıflarımızı Güncelleştirme

Albüm sınıfını aşağıda gösterildiği gibi güncelleştirin.

namespace MvcMusicStore.Models
{
    public class Album
    {
        public int      AlbumId     { get; set; }
        public int      GenreId     { get; set; }
        public int      ArtistId    { get; set; }
        public string   Title       { get; set; }
        public decimal  Price       { get; set; }
        public string   AlbumArtUrl { get; set; }
        public Genre    Genre       { get; set; }
        public Artist   Artist      { get; set; }
    }
}

Ardından, Genre sınıfında aşağıdaki güncelleştirmeleri yapın.

using System.Collections.Generic;
 
namespace MvcMusicStore.Models
{
    public partial class Genre
    {
        public int      GenreId     { get; set; }
        public string   Name        { get; set; }
        public string   Description { get; set; }
        public List<Album> Albums   { get; set; }
    }
}

App_Data klasörünü ekleme

SQL Server Express veritabanı dosyalarımızı barındırmak için projemize bir App_Data dizini ekleyeceğiz. App_Data, ASP.NET'da veritabanı erişimi için doğru güvenlik erişim izinlerine sahip olan özel bir dizindir. Proje menüsünden ASP.NET Klasör Ekle'yi seçin ve App_Data.

A S P eklemek için Proje menüsünün ekran görüntüsü. Uygulama Verilerini seçmek için N E T Klasörü.

web.config dosyasında Bağlantı Dizesi Oluşturma

Entity Framework'ün veritabanımıza nasıl bağlanacağını bilmesi için web sitesinin yapılandırma dosyasına birkaç satır ekleyeceğiz. Projenin kökünde bulunan Web.config dosyasına çift tıklayın.

Çözüm gezgininde bir bağlantı dizesi oluşturmak için Web yapılandırma dosyasının ekran görüntüsü.

Bu dosyanın en altına kaydırın ve aşağıda gösterildiği gibi son satırın hemen üstüne bir <connectionStrings> bölümü ekleyin.

<connectionStrings>
    <add name="MusicStoreEntities"
     connectionString="Data Source=|DataDirectory|MvcMusicStore.sdf"
     providerName="System.Data.SqlServerCe.4.0"/>
  </connectionStrings>  
</configuration>

Bağlam Sınıfı Ekleme

Models klasörüne sağ tıklayın ve MusicStoreEntities.cs adlı yeni bir sınıf ekleyin.

Bağlam Sınıfı eklemek için Models klasörünün ekran görüntüsü.

Bu sınıf Entity Framework veritabanı bağlamını temsil eder ve oluşturma, okuma, güncelleştirme ve silme işlemlerimizi bizim için işler. Bu sınıfın kodu aşağıda gösterilmiştir.

using System.Data.Entity;
 
namespace MvcMusicStore.Models
{
    public class MusicStoreEntities : DbContext
    {
        public DbSet<Album> Albums { get; set; }
        public DbSet<Genre> Genres { get; set; }
    }
}

İşte bu kadar - başka bir yapılandırma, özel arabirimler vb. yoktur. DbContext temel sınıfını genişleterek MusicStoreEntities sınıfımız veritabanı işlemlerimizi bizim için işleyebilir. Bu özelliği bağladığımıza göre veritabanımızdaki bazı ek bilgilerden yararlanmak için model sınıflarımıza birkaç özellik daha ekleyelim.

Mağaza kataloğu verilerimizi ekleme

Entity Framework'te yeni oluşturulan veritabanına "seed" verileri ekleyen bir özelliğin avantajlarından yararlanacağız. Bu, mağaza kataloğumuzu Tarzlar, Sanatçılar ve Albümler listesiyle önceden doldurur. Bu öğreticinin önceki bölümlerinde kullanılan site tasarım dosyalarımızı da içeren MvcMusicStore-Assets.zip indirme, Kod adlı bir klasörde bulunan bu tohum verilerini içeren bir sınıf dosyasına sahiptir.

Code / Models klasöründe SampleData.cs dosyasını bulun ve aşağıda gösterildiği gibi projemizdeki Models klasörüne bırakın.

Örnek Veri C S dosyasını bulmak ve depo kataloğu verilerini eklemek için Kod veya Modeller klasörünün ekran görüntüsü.

Şimdi Entity Framework'e bu SampleData sınıfını bildirmek için bir kod satırı eklememiz gerekiyor. Projenin kökündeki Global.asax dosyasına çift tıklayarak açın ve Application_Start yönteminin en üstüne aşağıdaki satırı ekleyin.

protected void Application_Start()
{
    System.Data.Entity.Database.SetInitializer(
    new MvcMusicStore.Models.SampleData());
    AreaRegistration.RegisterAllAreas();
    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);
 }

Bu noktada, projemiz için Entity Framework'ün yapılandırılması için gereken çalışmayı tamamladık.

Veritabanını Sorgulama

Şimdi StoreController'ımızı güncelleştirerek "kukla verileri" kullanmak yerine tüm bilgilerini sorgulamak üzere veritabanımıza çağırmasını sağlayın. StoreController'da storeDB adlı MusicStoreEntities sınıfının bir örneğini barındıracak bir alan bildirerek başlayacağız:

public class StoreController : Controller
{
    MusicStoreEntities storeDB = new MusicStoreEntities();

Veritabanını sorgulamak için Mağaza Dizini'ni güncelleştirme

MusicStoreEntities sınıfı Entity Framework tarafından korunur ve veritabanımızdaki her tablo için bir koleksiyon özelliği kullanıma sunar. Şimdi Veritabanımızdaki tüm Tarzları almak için StoreController'ın Dizin eylemini güncelleştirelim. Daha önce dize verilerini sabit kodlayarak bunu yapmıştık. Artık yalnızca Entity Framework bağlamı Generes koleksiyonunu kullanabiliriz:

public ActionResult Index()
{
    var genres = storeDB.Genres.ToList();
    return View(genres);
 }

Daha önce döndürdiğimiz Aynı StoreIndexViewModel'i döndürmeye devam ettiğimizden Görünüm şablonumuzda herhangi bir değişiklik yapmanız gerekmez. Şimdi yalnızca veritabanımızdan canlı verileri döndüreceğiz.

Projeyi yeniden çalıştırıp "/Store" URL'sini ziyaret ettiğimizde şimdi veritabanımızda tüm Tarzların listesini göreceğiz:

Veritabanındaki tüm Tarzlar listesinin ekran görüntüsü.

Canlı verileri kullanmak için Mağaza Göz Atma ve Ayrıntılar'ı güncelleştirme

/Store/Browse?genre=[some-genre] eylem yöntemiyle, ada göre bir Tarz arıyoruz. Aynı Tarz adı için hiçbir zaman iki giriş olmaması gerektiğinden yalnızca bir sonuç bekliyoruz ve bu nedenle kullanabiliriz. LinQ'te aşağıdakine benzer uygun Genre nesnesini sorgulamak için Single() uzantısı (henüz bunu yazma):

var example = storeDB.Genres.Single(g => g.Name == "Disco");

Tek yöntemi, bir Lambda ifadesini parametre olarak alır ve bu da adı tanımladığımız değerle eşleşen tek bir Genre nesnesi istediğimizi belirtir. Yukarıdaki örnekte, Disko ile eşleşen bir Ad değerine sahip tek bir Genre nesnesi yüklüyoruz.

Genre nesnesi alındığında da yüklenmesini istediğimiz diğer ilgili varlıkları belirtmemizi sağlayan bir Entity Framework özelliğinden yararlanacağız. Bu özellik Sorgu Sonucu Şekillendirme olarak adlandırılır ve ihtiyacımız olan tüm bilgileri almak için veritabanına erişme sayısını azaltmamıza olanak tanır. Aldığımız Tarz albümlerini önceden getirmek istediğimiz için ilgili albümleri de istediğimizi belirtmek için sorgumuzu Genres.Include("Albums") öğesini içerecek şekilde güncelleştireceğiz. Bu daha verimlidir çünkü hem Tür hem de Albüm verilerimizi tek bir veritabanı isteğinde alır.

Açıklamalar aradan çıktığı için güncelleştirilmiş Gözat denetleyicisi eylemimiz şu şekilde görünür:

public ActionResult Browse(string genre)
{
    // Retrieve Genre and its Associated Albums from database
    var genreModel = storeDB.Genres.Include("Albums")
        .Single(g => g.Name == genre);

    return View(genreModel);
}

Artık Her Tarz'da bulunan albümleri görüntülemek için Mağaza Göz Atma Görünümü'nü güncelleştirebiliriz. Görünüm şablonunu açın (/Views/Store/Browse.cshtml içinde bulunur) ve aşağıda gösterildiği gibi madde işaretli albüm listesi ekleyin.

@model MvcMusicStore.Models.Genre
@{
    ViewBag.Title = "Browse";
}
<h2>Browsing Genre: @Model.Name</h2>
<ul>
    @foreach (var album in Model.Albums)
    {
        <li>
            @album.Title
        </li>
    }
</ul>

Uygulamamızı çalıştırıp /Store/Browse?genre=Jazz'a göz atmak, sonuçlarımızın artık veritabanından çekildiğini ve seçili Türümüzdeki tüm albümlerin görüntülendiğini gösteriyor.

Veritabanından çekilen sonuçların ekran görüntüsü seçili Tarz'daki tüm albümleri görüntüler.

/Store/Details/[id] URL'mizde de aynı değişikliği yapacağız ve sahte verilerimizi, kimliği parametre değeriyle eşleşen bir Albüm yükleyen bir veritabanı sorgusuyla değiştireceğiz.

public ActionResult Details(int id)
{
    var album = storeDB.Albums.Find(id);
 
    return View(album);
}

Uygulamamızı çalıştırmak ve /Store/Details/1'e göz atmak, sonuçlarımızın artık veritabanından çekildiğini gösterir.

Mağaza Ayrıntıları sayfasının ekran görüntüsü, sonuçların veritabanından da çekildiğini gösterir.

Mağaza Ayrıntıları sayfamız Albüm Kimliğine göre bir albüm görüntüleyecek şekilde ayarlandı. Şimdi Ayrıntılar görünümüne bağlantı vermek için Gözat görünümünü güncelleştirelim. Html.ActionLink'i, önceki bölümün sonunda Mağaza Dizini'nden Store Browse'a bağlamak için yaptığımız gibi kullanacağız. Gözat görünümünün tam kaynağı aşağıda görünür.

@model MvcMusicStore.Models.Genre
@{
    ViewBag.Title = "Browse";
}
<h2>Browsing Genre: @Model.Name</h2>
<ul>
    @foreach (var album in Model.Albums)
    {
        <li>
            @Html.ActionLink(album.Title,
"Details", new { id = album.AlbumId })
        </li>
    }
</ul>

Artık Mağaza sayfamızdan kullanılabilir albümleri listeleyen bir Tarz sayfasına göz atabiliyoruz ve bir albüme tıklayarak bu albümün ayrıntılarını görüntüleyebiliriz.

Mağaza sayfasından Tarz sayfasına göz atabilmenin ekran görüntüsü.