Share via


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

Microsoft tarafından

PDF’yi İndir

Bu öğreticinin amacı, bir ASP.NET MVC uygulaması için model sınıfları oluşturmanın bir yöntemini 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şturmanın bir yöntemini açıklamaktır. Bu öğreticide, Microsoft LINQ to SQL'nden yararlanarak model sınıfları oluşturmayı ve veritabanı erişimi gerçekleştirmeyi öğreneceksiniz

Bu öğreticide, temel bir Movie veritabanı uygulaması oluşturacağız. Film veritabanı uygulamasını mümkün olan en hızlı ve en kolay şekilde oluşturarak başlıyoruz. 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, bir 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 sunar. 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

Bu öğreticide model sınıflarını nasıl oluşturabileceğinizi göstermek için basit bir Movie veritabanı uygulaması oluşturuyoruz. İlk adım yeni bir veritabanı oluşturmaktır. Çözüm Gezgini penceresinde 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 bir 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).

Visual Web Developer kullanılırken Sunucu Gezgini penceresine Veritabanı Gezgini penceresi adı verilir.

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 eklememiz gerekiyor. 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 resmi 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 şey 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 yönelik eklemeler veya güncelleştirmeler yaparken birincil anahtar sütunlarınızı belirtmenizi gerektirir.

Ardından, Is Identity özelliğine 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.

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

MVC modelimiz tblMovie veritabanı tablosunu temsil eden LINQ to SQL sınıflar içerir. 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. Veritabanı tablolarını Sunucu Gezgini penceresinden Nesne İlişkisel Tasarımcısı sürükleyerek belirli veritabanı tablolarını temsil eden LINQ to SQL Sınıfları oluşturabilirsiniz. tblMovie veritabanı tablosunu Nesne İlişkisel Tasarımcısı eklememiz gerekir (bkz. Şekil 5).

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

Şekil 05: Nesne İlişkisel Tasarımcısı kullanma (Tam boyutlu resmi 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ızı tblMovieçağırmak istemiyoruz. 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ız olduğuna göre, veritabanından veri almak için bu sınıfları kullanabiliriz. Bu bölümde, doğrudan bir denetleyici eylemi içinde LINQ to SQL sınıflarını 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ı, Listeleme 1'deki sınıfı gibi görünecek şekilde değiştirin.

Listeleme 1 – Controllers\HomeController.cs

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

namespace MvcApplication1.Controllers
{
     [HandleError]
     public class HomeController : Controller
     {
          public ActionResult Index()
          {
               var dataContext = new MovieDataContext();
               var movies = from m in dataContext.Movies
                    select m;
               return View(movies);
          }
     }
}

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

Veritabanı tablosundaki tüm filmleri tblMovies almak için DataContext'e karşı linq sorgusu gerçekleştirilir. Film listesi adlı moviesyerel 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örde bulabilirsiniz. Dizin görünümünü Liste 2'deki görünüm gibi görünecek şekilde güncelleştirin.

Listeleme 2 – Views\Home\Index.aspx

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="MvcApplication1.Views.Home.Index" %>
<%@ Import Namespace="MvcApplication1.Models" %>
<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">

     <ul>
          <% foreach (Movie m in (IEnumerable)ViewData.Model)

          { %>
               <li> <%= m.Title %> </li>
          <% } %>
     </ul>
</asp:Content>

Değiştirilen Dizin görünümünün görünümün en üstünde bir <%@ import namespace %> yönerge içerdiğine dikkat edin. Bu yönerge, öğesini MvcApplication1.Models namespaceiçeri aktarır. Görünümde sınıflarla (özellikle Movie de sınıfıylamodel) çalışmak için bu ad alanına ihtiyacımız var.

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

özelliğinin değerinin ViewData.Model öğesine IEnumerableyayınlandığını fark edin. bu, içindekiler ViewData.Modelarasında döngü yapmak için gereklidir. Buradaki bir diğer seçenek de kesin türe sahip viewbir oluşturmaktır. Kesin olarak türü belirlenmiş viewbir oluşturduğunuzda, özelliği bir görünümün ViewData.Model arka kod arkası sınıfında belirli bir türe yayınlarsınız.

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

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

Film ekleme

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

Tabloya tblMovies 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. Sınıfı doğrudan denetleyici eyleminden Index() kullandıkMovieDataContext. 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 sorunlar oluşturur.

LINQ to SQL bir denetleyici sınıfı içinde 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çmeyi tercih edebilirsiniz. Bu durumda, uygulamanızdaki veritabanına erişen her denetleyiciyi yeniden yazmanız gerekir.

LINQ to SQL bir denetleyici sınıfı içinde 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 arabirime yazarsınız. Bu şekilde, gelecekte farklı veri erişim teknolojilerini kullanarak depoyu uygulayabilirsiniz.

Listeleme 3'teki arabirim adlandırılmıştır IMovieRepository ve adlı ListAll()tek bir yöntemi temsil eder.

Listeleme 3 – Models\IMovieRepository.cs

using System.Collections.Generic;
namespace MvcApplication1.Models
{
     public interface IMovieRepository
     {
          IList<Movie> ListAll();
     }
}

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

Listeleme 4 – Models\MovieRepository.cs

using System.Collections.Generic;
using System.Linq;

namespace MvcApplication1.Models
{
     public class MovieRepository : IMovieRepository
     {
          private MovieDataContext _dataContext;

          public MovieRepository()
          {
                _dataContext = new MovieDataContext();
          }

          #region IMovieRepository Members

          public IList<Movie> ListAll()
          {
               var movies = from m in _dataContext.Movies
                    select m;
               return movies.ToList();
          }

          #endregion
     }
}

Son olarak, MoviesController Listeleme 5'teki sınıf Depo desenini kullanır. Artık doğrudan LINQ to SQL sınıfları kullanmaz.

Listeleme 5 – Controllers\MoviesController.cs

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

namespace MvcApplication1.Controllers
{
     public class MoviesController : Controller
     {
          private IMovieRepository _repository;

          public MoviesController() : this(new MovieRepository())
          {
          }

          public MoviesController(IMovieRepository repository)
          {
               _repository = repository;
          }

          public ActionResult Index()
          {
               return View(_repository.ListAll());
          }
     }
}

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

İkinci oluşturucunun tek bir parametresi vardır: parametre IMovieRepository . Bu oluşturucu, parametrenin değerini adlı _repositorysınıf düzeyi alanına atar.

MoviesController sınıfı, Bağımlılık Ekleme deseni olarak adlandırılan bir yazılım tasarımı deseninin avantajlarından yararlanır. Özellikle Oluşturucu Bağımlılık Ekleme adlı bir öğe 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

sınıfındaki MoviesController tüm kodun (ilk oluşturucu hariç) gerçek MovieRepository sınıf yerine arabirimle IMovieRepository etkileşime geçtiğini fark edin. 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, arabirimi alternatif veritabanı erişim teknolojisini kullanan bir sınıfla uygulamanız IMovieRepository yeterlidir. Örneğin, bir EntityFrameworkMovieRepository sınıf veya SubSonicMovieRepository sınıf oluşturabilirsiniz. Denetleyici sınıfı arabirimine göre programlandığından, yeni bir uygulamasını IMovieRepository denetleyici sınıfına geçirebilirsiniz ve sınıf çalışmaya devam eder.

Ayrıca, sınıfını test MoviesController etmek istiyorsanız, sahte film deposu sınıfını HomeControlleröğesine geçirebilirsiniz. sınıfını IMovieRepository veritabanına gerçekten erişmeyen ancak arabiriminin tüm gerekli yöntemlerini IMovieRepository içeren bir sınıfla uygulayabilirsiniz. Bu şekilde, gerçek bir veritabanına gerçekten erişmeden sınıfı birim testi MoviesController 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ülemek için 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. LINQ to SQL sınıflarını bir denetleyici içinde kullanmak, bir MVC uygulamasında veritabanı verilerini hızlı ve kolay bir şekilde görüntülemenizi sağlar.

Ardından, veritabanı verilerini görüntülemek için biraz daha zor, ancak kesinlikle daha verimli bir yolu 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 bir sınıf yerine bir arabirime göre 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 sağlar.