LINQ to SQL ile Model Sınıfları Oluşturma (VB)

Microsoft tarafından

PDF’yi İndir

Bu öğreticinin amacı, bir ASP.NET MVC uygulaması için model sınıfları oluşturma yönteminden birini açıklamaktır. Bu öğreticide, Microsoft LINQ to SQL yararlanarak model sınıfları oluşturmayı ve veritabanı erişimi gerçekleştirmeyi öğreneceksiniz.

Bu öğreticinin amacı, bir ASP.NET MVC uygulaması için model sınıfları oluşturma yönteminden birini açıklamaktır. Bu öğreticide, Microsoft LINQ to SQL yararlanarak model sınıfları oluşturmayı ve veritabanı erişimi gerçekleştirmeyi öğreneceksiniz.

Bu öğreticide, temel bir Film veritabanı uygulaması oluşturacağız. Film veritabanı uygulamasını mümkün olan en hızlı ve en kolay şekilde oluşturarak başlayacağız. Tüm veri erişimimizi doğrudan denetleyici eylemlerimizden gerçekleştiririz.

Ardından, Depo düzenini kullanmayı öğreneceksiniz. Depo düzenini kullanmak için biraz daha fazla çalışma gerekir. Ancak, bu düzeni benimsemenin avantajı, değiştirilebilir ve kolayca test edilebilen uygulamalar oluşturmanıza olanak sağlamasıdır.

Model Sınıfı nedir?

MVC modeli, MVC görünümünde veya MVC denetleyicisinde bulunmayan tüm uygulama mantığını içerir. Özellikle, bir MVC modeli tüm uygulama iş ve veri erişim mantığınızı içerir.

Veri erişim mantığınızı uygulamak için çeşitli teknolojiler kullanabilirsiniz. Örneğin, Microsoft Entity Framework, NHibernate, Subsonic veya ADO.NET sınıflarını kullanarak veri erişim sınıflarınızı oluşturabilirsiniz.

Bu öğreticide veritabanını sorgulamak ve güncelleştirmek için LINQ to SQL kullanıyorum. LINQ to SQL, Microsoft SQL Server veritabanıyla etkileşim kurmanız için çok kolay bir yöntem sağlar. Ancak, ASP.NET MVC çerçevesinin hiçbir şekilde LINQ to SQL bağlı olmadığını anlamak önemlidir. ASP.NET MVC tüm veri erişim teknolojileriyle uyumludur.

Film Veritabanı Oluşturma

Model sınıflarını nasıl oluşturabileceğinizi göstermek için bu öğreticide basit bir Movie veritabanı uygulaması oluşturacağız. İlk adım yeni bir veritabanı oluşturmaktır. Çözüm Gezgini penceresindeki App_Data klasörüne sağ tıklayın ve Ekle, Yeni Öğe menü seçeneğini belirleyin. SQL Server Veritabanı şablonunu seçin, MoviesDB.mdf adını verin ve Ekle düğmesine tıklayın (bkz. Şekil 1).

Yeni SQL Server Veritabanı ekleme

Şekil 01: Yeni bir SQL Server Veritabanı ekleme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Yeni veritabanını oluşturduktan sonra, App_Data klasöründeki MoviesDB.mdf dosyasına çift tıklayarak veritabanını açabilirsiniz. MoviesDB.mdf dosyasına çift tıklanması Sunucu Gezgini penceresini açar (bkz. Şekil 2).

Sunucu Gezgini penceresi, Visual Web Developer kullanılırken Veritabanı Gezgini penceresi olarak adlandırılır.

Klasör hiyerarşisinde Tablolar klasörünün vurgulandığını gösteren Sunucu Gezgini penceresinin ekran görüntüsü.

Şekil 02: Sunucu Gezgini penceresini kullanma (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Veritabanımıza filmlerimizi temsil eden bir tablo eklemeliyiz. Tablolar klasörüne sağ tıklayın ve Yeni Tablo Ekle menü seçeneğini belirleyin. Bu menü seçeneği seçildiğinde Tablo Tasarım Aracı açılır (bkz. Şekil 3).

Tablo Tasarım Aracı özelliğini gösteren Microsoft Visual Studio penceresinin ekran görüntüsü.

Şekil 03: Tablo Tasarım Aracı (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Veritabanı tablomuza aşağıdaki sütunları eklemeliyiz:

Sütun Adı Veri Türü Null'lara İzin Ver
Id int Yanlış
Başlık Nvarchar(200) Yanlış
Yönetmen Nvarchar(50) Yanlış

Kimlik sütununa iki özel işlem yapmanız gerekir. İlk olarak, Tablo Tasarım Aracı sütununu seçip bir anahtarın simgesine tıklayarak Kimlik sütununu birincil anahtar sütunu olarak işaretlemeniz gerekir. LINQ to SQL, veritabanına ekleme veya güncelleştirme gerçekleştirirken birincil anahtar sütunlarınızı belirtmenizi gerektirir.

Ardından, Kimlik özelliğinin Evet değerini atayarak Kimlik sütununu kimlik sütunu olarak işaretlemeniz gerekir (bkz. Şekil 3). Kimlik sütunu, tabloya yeni bir veri satırı eklediğinizde otomatik olarak yeni bir sayı atanan bir sütundur.

Bu değişiklikleri yaptıktan sonra tabloyu tblMovie adıyla kaydedin. Kaydet düğmesine tıklayarak tabloyu kaydedebilirsiniz.

LINQ to SQL Sınıfları Oluşturma

MVC modelimiz, tblMovie veritabanı tablosunu temsil eden LINQ to SQL sınıflar içerecektir. Bu LINQ to SQL sınıflarını oluşturmanın en kolay yolu Modeller klasörüne sağ tıklamak, Ekle, Yeni Öğe'yi seçmek, LINQ to SQL Sınıfları şablonunu seçmek, sınıflara Movie.dbml adını vermek ve Ekle düğmesine tıklamaktır (bkz. Şekil 4).

LINQ to SQL sınıfları oluşturma

Şekil 04: LINQ to SQL sınıfları oluşturma (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Film LINQ to SQL Sınıflarını oluşturduktan hemen sonra Nesne İlişkisel Tasarımcısı görüntülenir. Belirli veritabanı tablolarını temsil eden LINQ to SQL Sınıfları oluşturmak için veritabanı tablolarını Sunucu Gezgini penceresinden Nesne İlişkisel Tasarımcısı sürükleyebilirsiniz. tblMovie veritabanı tablosunu Nesne İlişkisel Tasarımcısı eklememiz gerekir (bkz. Şekil 4).

Nesne İlişkisel Tasarımcısı kullanma

Şekil 05: Nesne İlişkisel Tasarımcısı kullanma (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Varsayılan olarak, Nesne İlişkisel Tasarımcısı Tasarım Aracı sürüklediğiniz veritabanı tablosuyla aynı ada sahip bir sınıf oluşturur. Ancak sınıfımıza tblMovie adını vermek istemeyiz. Bu nedenle, Tasarım Aracı sınıfının adına tıklayın ve sınıfın adını Movie olarak değiştirin.

Son olarak, LINQ to SQL Sınıflarını kaydetmek için Kaydet düğmesine (disketin resmi) tıklamayı unutmayın. Aksi takdirde, LINQ to SQL Sınıfları Nesne İlişkisel Tasarımcısı tarafından oluşturulmaz.

Denetleyici Eyleminde LINQ to SQL Kullanma

artık LINQ to SQL sınıflarımıza sahip olduğumuza göre, veritabanından veri almak için bu sınıfları kullanabiliriz. Bu bölümde, doğrudan bir denetleyici eyleminin içinde LINQ to SQL sınıfları kullanmayı öğreneceksiniz. tblMovies veritabanı tablosundaki filmlerin listesini MVC görünümünde görüntüleyeceğiz.

İlk olarak HomeController sınıfını değiştirmemiz gerekir. Bu sınıf, uygulamanızın Controllers klasöründe bulunabilir. Sınıfı, Liste 1'deki sınıf gibi görünecek şekilde değiştirin.

Listeleme 1 – Controllers\HomeController.vb

<HandleError()> _
Public Class HomeController

     Inherits System.Web.Mvc.Controller

     Function Index()
          Dim dataContext As New MovieDataContext()
          Dim movies = From m In dataContext.Movies _
               Select m
          return View(movies)
     End Function
End Class

Listeleme 1'deki Index() eylemi, MoviesDB veritabanını temsil etmek için bir LINQ to SQL DataContext sınıfı (MovieDataContext) kullanır. MoveDataContext sınıfı Visual Studio Nesne İlişkisel Tasarımcısı tarafından oluşturulmuştur.

tblMovies veritabanı tablosundan tüm filmleri almak için DataContext'e karşı linq sorgusu gerçekleştirilir. Film listesi filmler adlı yerel bir değişkene atanır. Son olarak, film listesi görüntüleme verileri aracılığıyla görünüme geçirilir.

Filmleri göstermek için bir sonraki adımda Dizin görünümünü değiştirmemiz gerekir. Dizin görünümünü Views\Home\ klasöründe bulabilirsiniz. Dizin görünümünü Liste 2'deki görünüm gibi görünecek şekilde güncelleştirin.

Liste 2 – Views\Home\Index.aspx

<%@ Page Language="VB" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="false" CodeBehind="Index.aspx.vb" Inherits="MvcApplication1.Index" %>
<%@ Import Namespace="MvcApplication1" %>
<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">

<ul>
<%  For Each m As Movie In ViewData.Model%>
    <li><%= m.Title %></li>
<% Next%>
</ul>
</asp:Content>

Değiştirilen Dizin görünümünün, görünümün en üstünde % <@ içeri aktarma ad alanı %> yönergesi içerdiğine dikkat edin. Bu yönerge, MvcApplication1 ad alanını içeri aktarır. Görünümde model sınıfları (özellikle Movie sınıfı) ile çalışmak için bu ad alanına ihtiyacımız var.

Liste 2'deki görünüm, ViewData.Model özelliği tarafından temsil edilen tüm öğelerde yinelenen Her İçin döngüsünü içerir. Title özelliğinin değeri her film için görüntülenir.

ViewData.Model özelliğinin değerinin bir IEnumerable'a atandığını görebilirsiniz. ViewData.Model'in içeriğinde döngü yapmak için bu gereklidir. Burada bir diğer seçenek de kesin olarak belirlenmiş bir görünüm oluşturmaktır. Kesin türü belirlenmiş bir görünüm oluşturduğunuzda ViewData.Model özelliğini görünümün arka kod sınıfındaki belirli bir türe yayınlarsınız.

HomeController sınıfını ve Dizin görünümünü değiştirdikten sonra uygulamayı çalıştırırsanız boş bir sayfa alırsınız. tblMovies veritabanı tablosunda film kaydı olmadığından boş bir sayfa alırsınız.

tblMovies veritabanı tablosuna kayıt eklemek için, Sunucu Gezgini penceresinde (Visual Web Developer'da Veritabanı Gezgini penceresi) tblMovies veritabanı tablosuna sağ tıklayın ve Tablo Verilerini Göster menü seçeneğini belirleyin. Görüntülenen kılavuzu kullanarak film kayıtları ekleyebilirsiniz (bkz. Şekil 5).

Film ekleme

Şekil 06: Film ekleme (Tam boyutlu resmi görüntülemek için tıklayın)

tblMovies tablosuna bazı veritabanı kayıtları ekledikten ve uygulamayı çalıştırdıktan sonra sayfayı Şekil 7'de görürsünüz. Tüm film veritabanı kayıtları madde işaretli bir listede görüntülenir.

Dizin görünümüyle film görüntüleme

Şekil 07: Filmleri Dizin görünümüyle görüntüleme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Depo Desenini Kullanma

Önceki bölümde, doğrudan bir denetleyici eylemi içinde LINQ to SQL sınıfları kullandık. MovieDataContext sınıfını doğrudan Index() denetleyici eyleminden kullandık. Basit bir uygulama söz konusu olduğunda bunu yapmanın yanlış bir yanı yoktur. Ancak, doğrudan bir denetleyici sınıfında LINQ to SQL ile çalışmak, daha karmaşık bir uygulama oluşturmanız gerektiğinde sorunlara neden olur.

Bir denetleyici sınıfı içinde LINQ to SQL kullanmak, gelecekte veri erişim teknolojileri arasında geçiş yapmanızı zorlaştırır. Örneğin, Veri erişim teknolojiniz olarak Microsoft LINQ to SQL'ı kullanmaktan Microsoft Entity Framework'e geçmeye karar vekleyebilirsiniz. Bu durumda, uygulamanızdaki veritabanına erişen her denetleyiciyi yeniden yazmanız gerekir.

Denetleyici sınıfı içinde LINQ to SQL kullanmak, uygulamanız için birim testleri oluşturmayı da zorlaştırır. Normalde, birim testleri gerçekleştirirken veritabanıyla etkileşime geçmek istemezsiniz. Birim testlerinizi veritabanı sunucunuzu değil uygulama mantığınızı test etmek için kullanmak istiyorsunuz.

Gelecekteki değişikliğe daha uyarlanabilir ve daha kolay test edilebilen bir MVC uygulaması oluşturmak için Depo desenini kullanmayı göz önünde bulundurmalısınız. Depo desenini kullandığınızda, tüm veritabanı erişim mantığınızı içeren ayrı bir depo sınıfı oluşturursunuz.

Depo sınıfını oluşturduğunuzda, depo sınıfı tarafından kullanılan tüm yöntemleri temsil eden bir arabirim oluşturursunuz. Denetleyicilerinizin içinde, kodunuzu depo yerine arabirimine yazarsınız. Bu şekilde, gelecekte farklı veri erişim teknolojilerini kullanarak depoyu uygulayabilirsiniz.

Listing 3'teki arabirim IMovieRepository olarak adlandırılır ve ListAll() adlı tek bir yöntemi temsil eder.

Listeleme 3 – Models\IMovieRepository.vb

Public Interface IMovieRepository
     Function ListAll() As IList(Of Movie)
End Interface

Listing 4'teki depo sınıfı IMovieRepository arabirimini uygular. IMovieRepository arabiriminin gerektirdiği yönteme karşılık gelen ListAll() adlı bir yöntem içerdiğine dikkat edin.

Listeleme 4 – Models\MovieRepository.vb

Public Class MovieRepository Implements IMovieRepository
         Private _dataContext As MovieDataContext

         Public Sub New()
              _dataContext = New MovieDataContext()
         End Sub

         Public Function ListAll() As IList(Of Movie) Implements IMovieRepository.ListAll
              Dim movies = From m In _dataContext.Movies _
                   Select m
              Return movies.ToList()
         End Function
End Class

Son olarak, Listing 5'teki MoviesController sınıfı Repository desenini kullanır. Artık doğrudan LINQ to SQL sınıfları kullanmıyor.

Listeleme 5 – Controllers\MoviesController.vb

using System.Web.Mvc;
using MvcApplication1.Models;

namespace MvcApplication1.Controllers
{
    Public Class MoviesController 
        Inherits System.Web.Mvc.Controller

             Private _repository As IMovieRepository

             Sub New()
                  Me.New(New MovieRepository())
             End Sub

             Sub New(ByVal repository As IMovieRepository)
                  _repository = repository
             End Sub

             Function Index()
                  Return View(_repository.ListAll())
             End Function
    End Class
}

Listing 5'teki MoviesController sınıfının iki oluşturucusu olduğuna dikkat edin. Uygulamanız çalışırken ilk oluşturucu olan parametresiz oluşturucu çağrılır. Bu oluşturucu MovieRepository sınıfının bir örneğini oluşturur ve ikinci oluşturucuya geçirir.

İkinci oluşturucunun tek bir parametresi vardır: IMovieRepository parametresi. Bu oluşturucu, parametrenin değerini _repository adlı sınıf düzeyinde bir alana atar.

MoviesController sınıfı, Bağımlılık Ekleme düzeni adı verilen bir yazılım tasarım deseninin avantajlarından yararlanıyor. Özellikle, Oluşturucu Bağımlılık Ekleme adlı bir şey kullanıyor. Martin Fowler'ın aşağıdaki makalesini okuyarak bu düzen hakkında daha fazla bilgi edinebilirsiniz:

http://martinfowler.com/articles/injection.html

MoviesController sınıfındaki tüm kodun (ilk oluşturucu hariç) gerçek MovieRepository sınıfı yerine IMovieRepository arabirimiyle etkileşime geçtiğini göreceksiniz. Kod, arabirimin somut bir uygulaması yerine soyut bir arabirimle etkileşim kurar.

Uygulama tarafından kullanılan veri erişim teknolojisini değiştirmek istiyorsanız, IMovieRepository arabirimini alternatif veritabanı erişim teknolojisini kullanan bir sınıfla uygulamanız yeterlidir. Örneğin, bir EntityFrameworkMovieRepository sınıfı veya SubSonicMovieRepository sınıfı oluşturabilirsiniz. Denetleyici sınıfı arabirime göre programlandığından, denetleyici sınıfına yeni bir IMovieRepository uygulamasını geçirebilirsiniz ve sınıf çalışmaya devam eder.

Ayrıca, MoviesController sınıfını test etmek istiyorsanız, MoviesController'a sahte bir film deposu sınıfı geçirebilirsiniz. IMovieRepository sınıfını veritabanına erişmeyen ancak IMovieRepository arabiriminin tüm gerekli yöntemlerini içeren bir sınıfla uygulayabilirsiniz. Bu şekilde, gerçek bir veritabanına erişmeden MoviesController sınıfını birim testi yapabilirsiniz.

Özet

Bu öğreticinin amacı, Microsoft LINQ to SQL yararlanarak MVC model sınıflarını nasıl oluşturabileceğinizi göstermekti. bir ASP.NET MVC uygulamasında veritabanı verilerini görüntülemeye yönelik iki stratejiyi inceledik. İlk olarak, LINQ to SQL sınıfları oluşturduk ve sınıfları doğrudan bir denetleyici eylemi içinde kullandık. Denetleyici içinde LINQ to SQL sınıfları kullanmak, MVC uygulamasında veritabanı verilerini hızlı ve kolay bir şekilde görüntülemenizi sağlar.

Daha sonra veritabanı verilerini görüntülemek için biraz daha zor, ancak kesinlikle daha verimli bir yol keşfettik. Depo düzeninden yararlandık ve tüm veritabanı erişim mantığımızı ayrı bir depo sınıfına yerleştirdik. Denetleyicimizde kodumuzun tamamını somut sınıf yerine bir arabirime karşı yazdık. Depo düzeninin avantajı, gelecekte veritabanı erişim teknolojilerini kolayca değiştirmemizi ve denetleyici sınıflarımızı kolayca test etmemizi mümkün hale getirmektir.