LINQ to SQL ile Model Sınıfları Oluşturma (C#)
Microsoft tarafından
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).
Ş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.
Ş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).
Ş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).
Ş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).
Ş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ı () MovieDataContext
kullanı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ı movies
yerel 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 namespace
iç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 movie
biri için görüntülenir.
özelliğinin değerinin ViewData.Model
öğesine IEnumerable
yayınlandığını fark edin. bu, içindekiler ViewData.Model
arasında döngü yapmak için gereklidir. Buradaki bir diğer seçenek de kesin türe sahip view
bir oluşturmaktır. Kesin olarak türü belirlenmiş view
bir 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).
Ş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.
Ş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ı _repository
sı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.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin