Vytvoření tříd modelu pomocí LINQ to SQL (C#)
od Microsoftu
Cílem tohoto kurzu je vysvětlit jednu metodu vytváření tříd modelu pro aplikaci ASP.NET MVC. V tomto kurzu se naučíte vytvářet třídy modelů a přistupovat k databázi s využitím microsoft LINQ to SQL.
Cílem tohoto kurzu je vysvětlit jednu metodu vytváření tříd modelu pro aplikaci ASP.NET MVC. V tomto kurzu se naučíte vytvářet třídy modelů a přistupovat k databázi s využitím microsoftu LINQ to SQL
V tomto kurzu sestavíme základní databázovou aplikaci Movie. Začneme vytvořením databázové aplikace Movie nejrychlejším a nejjednodušším způsobem. Přístup ke všem datům provádíme přímo z akcí kontroleru.
Dále se dozvíte, jak používat model úložiště. Použití modelu úložiště vyžaduje trochu více práce. Výhodou přijetí tohoto modelu je ale to, že umožňuje vytvářet aplikace, které se dají přizpůsobit změnám a dají se snadno testovat.
Co je třída modelu?
Model MVC obsahuje veškerou logiku aplikace, která není obsažena v zobrazení MVC nebo kontroleru MVC. Konkrétně model MVC obsahuje veškerou logiku obchodních aplikací a přístupu k datům.
K implementaci logiky přístupu k datům můžete použít celou řadu různých technologií. Můžete například vytvořit třídy přístupu k datům pomocí tříd Microsoft Entity Framework, NHibernate, Subsonic nebo ADO.NET.
V tomto kurzu používám LINQ to SQL k dotazování a aktualizaci databáze. LINQ to SQL poskytuje velmi snadný způsob interakce s databází Microsoft SQL Server. Je však důležité si uvědomit, že architektura ASP.NET MVC není nijak svázaná s LINQ to SQL. ASP.NET MVC je kompatibilní s jakoukoli technologií přístupu k datům.
Vytvoření filmové databáze
V tomto kurzu – abychom ukázali, jak můžete vytvářet třídy modelů – vytvoříme jednoduchou databázovou aplikaci Movie. Prvním krokem je vytvoření nové databáze. V okně Průzkumník řešení klikněte pravým tlačítkem na složku App_Data a vyberte možnost nabídky Přidat, Nová položka. Vyberte šablonu SQL Server Database, pojmenujte ji MoviesDB.mdf a klikněte na tlačítko Přidat (viz obrázek 1).
Obrázek 01: Přidání nové databáze SQL Server (kliknutím zobrazíte obrázek v plné velikosti)
Po vytvoření nové databáze můžete databázi otevřít poklikáním na soubor MoviesDB.mdf ve složce App_Data. Poklikáním na soubor MoviesDB.mdf se otevře okno Průzkumník serveru (viz obrázek 2).
Okno Průzkumníka serveru se při použití visual web developeru nazývá okno Průzkumník databáze.
Obrázek 02: Použití okna Průzkumníka serveru (kliknutím zobrazíte obrázek v plné velikosti)
Do naší databáze musíme přidat jednu tabulku, která představuje naše filmy. Klikněte pravým tlačítkem na složku Tabulky a vyberte možnost nabídky Přidat novou tabulku. Výběrem této možnosti nabídky se otevře Designer tabulka (viz obrázek 3).
Obrázek 03: Tabulka Designer (kliknutím zobrazíte obrázek v plné velikosti)
Do tabulky databáze musíme přidat následující sloupce:
Název sloupce | Datový typ | Povolit hodnoty Null |
---|---|---|
Id | Int | Ne |
Nadpis | Nvarchar(200) | Ne |
Ředitel | Nvarchar(50) | Ne |
Se sloupcem Id musíte udělat dvě speciální věci. Nejprve musíte sloupec Id označit jako sloupec primárního klíče tak, že vyberete sloupec v tabulce Designer a kliknete na ikonu klíče. LINQ to SQL vyžaduje, abyste při vkládání nebo aktualizacích databáze zadali sloupce primárního klíče.
Dále musíte sloupec Id označit jako sloupec Identity tím, že vlastnosti Is Identity přiřadíte hodnotu Ano (viz Obrázek 3). Sloupec Identita je sloupec, kterému se automaticky přiřadí nové číslo pokaždé, když do tabulky přidáte nový řádek dat.
Vytvoření tříd LINQ to SQL
Náš model MVC bude obsahovat LINQ to SQL třídy, které představují tabulku databáze tblMovie. Nejjednodušší způsob, jak tyto LINQ to SQL třídy vytvořit, je kliknout pravým tlačítkem na složku Modely, vybrat Přidat, Nová položka, vybrat šablonu LINQ to SQL Třídy, pojmenovat třídy Movie.dbml a kliknout na tlačítko Přidat (viz obrázek 4).
Obrázek 04: Vytváření tříd LINQ to SQL (kliknutím zobrazíte obrázek v plné velikosti)
Hned po vytvoření třídy Movie LINQ to SQL se zobrazí Návrhář relací objektů. Databázové tabulky můžete přetáhnout z okna Průzkumníka serveru do Návrhář relací objektů a vytvořit tak třídy LINQ to SQL, které představují konkrétní databázové tabulky. Do Návrhář relací objektů musíme přidat tabulku databáze tblMovie (viz obrázek 5).
Obrázek 05: Použití Návrhář relací objektů (kliknutím zobrazíte obrázek v plné velikosti)
Ve výchozím nastavení Návrhář relací objektů vytvoří třídu se stejným názvem jako tabulka databáze, kterou přetáhnete do Designer. Nechceme ale naši třídu tblMovie
nazývat . Proto klikněte na název třídy v Designer a změňte název třídy na Movie.
Nakonec nezapomeňte kliknout na tlačítko Uložit (obrázek diskety) a uložit LINQ to SQL Třídy. Jinak Návrhář relací objektů třídy LINQ to SQL nevygeneruje.
Použití LINQ to SQL v akci kontroleru
Teď, když máme LINQ to SQL třídy, můžeme tyto třídy použít k načtení dat z databáze. V této části se dozvíte, jak používat LINQ to SQL třídy přímo v rámci akce kontroleru. V zobrazení MVC zobrazíme seznam filmů z databázové tabulky tblMovies.
Nejprve musíme upravit třídu HomeController. Tuto třídu najdete ve složce Controllers vaší aplikace. Upravte třídu tak, aby vypadala jako třída ve výpisu 1.
Výpis 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);
}
}
}
Akce Index()
v seznamu 1 používá třídu LINQ to SQL DataContext () MovieDataContext
k reprezentaci MoviesDB
databáze. Třída MoveDataContext
byla vygenerována sadou Visual Studio Návrhář relací objektů.
Provede se dotaz LINQ na DataContext, aby se načetly všechny filmy z tblMovies
tabulky databáze. Seznam filmů je přiřazen k místní proměnné s názvem movies
. Nakonec se seznam filmů předá zobrazení prostřednictvím dat zobrazení.
Aby bylo možné filmy zobrazit, musíme dále upravit zobrazení indexu. Zobrazení Index najdete ve Views\Home\
složce . Aktualizujte zobrazení indexu tak, aby vypadalo jako zobrazení ve výpisu 2.
Výpis 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>
Všimněte si, že změněné zobrazení indexu obsahuje direktivu <%@ import namespace %>
v horní části zobrazení. Tato direktiva naimportuje .MvcApplication1.Models namespace
Tento obor názvů potřebujeme, abychom mohli v zobrazení pracovat s třídami model
– Movie
zejména s třídou .
Zobrazení ve výpisu 2 obsahuje smyčku foreach
, která prochází všechny položky reprezentované ViewData.Model
vlastností . Hodnota vlastnosti se Title
zobrazí pro každou movie
vlastnost .
Všimněte si, že hodnota ViewData.Model
vlastnosti je přetypovaná na IEnumerable
. To je nezbytné k tomu, aby bylo možné procházet obsah souboru ViewData.Model
. Další možností je vytvořit view
. Když vytvoříte objekt se silným typem view
, přetypujete ViewData.Model
vlastnost na konkrétní typ ve třídě kódu na pozadí zobrazení.
Pokud aplikaci spustíte po úpravě HomeController
třídy a zobrazení indexu, zobrazí se prázdná stránka. Zobrazí se prázdná stránka, protože v tblMovies
databázové tabulce nejsou žádné filmové záznamy.
Chcete-li přidat záznamy do tblMovies
tabulky databáze, klikněte pravým tlačítkem myši na tblMovies
tabulku databáze v okně Průzkumník serveru (okno Průzkumník databáze v aplikaci Visual Web Developer) a vyberte možnost nabídky Zobrazit data tabulky. Záznamy můžete vložit movie
pomocí mřížky, která se zobrazí (viz obrázek 6).
Obrázek 06: Vkládání filmů (kliknutím zobrazíte obrázek v plné velikosti)
Po přidání některých databázových záznamů do tblMovies
tabulky a spuštění aplikace se zobrazí stránka na obrázku 7. Všechny záznamy filmové databáze se zobrazí v seznamu s odrážkami.
Obrázek 07: Zobrazení filmů pomocí zobrazení indexu (kliknutím zobrazíte obrázek v plné velikosti)
Použití vzoru úložiště
V předchozí části jsme použili třídy LINQ to SQL přímo v rámci akce kontroleru. Použili MovieDataContext
jsme třídu přímo z Index()
akce kontroleru. V případě jednoduché aplikace není na tom nic špatného. Při přímé práci s LINQ to SQL ve třídě kontroleru ale dochází k problémům, když potřebujete sestavit složitější aplikaci.
Použití LINQ to SQL v rámci třídy kontroleru ztěžuje budoucí přepínání technologií přístupu k datům. Můžete se například rozhodnout přejít z používání Microsoft LINQ to SQL k používání microsoft Entity Framework jako technologie pro přístup k datům. V takovém případě byste museli přepsat každý kontroler, který přistupuje k databázi v rámci vaší aplikace.
Použití LINQ to SQL v rámci třídy kontroleru také ztěžuje sestavování testů jednotek pro vaši aplikaci. Za normálních okolností nechcete při provádění testů jednotek pracovat s databází. Testy jednotek chcete použít k testování logiky aplikace, nikoli databázového serveru.
Pokud chcete vytvořit aplikaci MVC, která se lépe přizpůsobí budoucím změnám a dá se snadněji testovat, měli byste zvážit použití modelu Úložiště. Když použijete model Úložiště, vytvoříte samostatnou třídu úložiště, která obsahuje veškerou logiku přístupu k databázi.
Při vytváření třídy úložiště vytvoříte rozhraní, které představuje všechny metody používané třídou úložiště. V rámci kontrolerů píšete kód do rozhraní místo do úložiště. Tímto způsobem můžete úložiště v budoucnu implementovat pomocí různých technologií přístupu k datům.
Rozhraní ve výpisu 3 má název IMovieRepository
a představuje jednu metodu s názvem ListAll()
.
Výpis 3 – Models\IMovieRepository.cs
using System.Collections.Generic;
namespace MvcApplication1.Models
{
public interface IMovieRepository
{
IList<Movie> ListAll();
}
}
Třída úložiště ve výpisu IMovieRepository
4 implementuje rozhraní . Všimněte si, že obsahuje metodu s názvem ListAll()
, která odpovídá metodě požadované rozhraním IMovieRepository
.
Výpis 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
}
}
Nakonec třída ve výpisu MoviesController
5 používá vzor úložiště. Už nepoužívá LINQ to SQL třídy přímo.
Výpis 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());
}
}
}
Všimněte si, že třída ve výpisu MoviesController
5 má dva konstruktory. První konstruktor, konstruktor bez parametrů, se volá, když je aplikace spuštěná. Tento konstruktor vytvoří instanci MovieRepository
třídy a předá ji druhému konstruktoru.
Druhý konstruktor má jeden parametr: IMovieRepository
parametr . Tento konstruktor jednoduše přiřadí hodnotu parametru do pole na úrovni třídy s názvem _repository
.
Třída MoviesController
využívá vzor návrhu softwaru označovaný jako model injektáže závislostí. Konkrétně používá něco, co se nazývá Injektáž závislostí konstruktoru. Další informace o tomto modelu si můžete přečíst v následujícím článku od Martina Fowlera:
http://martinfowler.com/articles/injection.html
Všimněte si, že veškerý kód ve MoviesController
třídě (s výjimkou prvního konstruktoru) komunikuje s rozhraním IMovieRepository
namísto skutečné MovieRepository
třídy. Kód interaguje s abstraktním rozhraním místo konkrétní implementace rozhraní.
Pokud chcete upravit technologii přístupu k datům používanou aplikací, můžete jednoduše implementovat IMovieRepository
rozhraní s třídou, která používá alternativní technologii přístupu k databázi. Můžete například vytvořit EntityFrameworkMovieRepository
třídu nebo SubSonicMovieRepository
třídu. Vzhledem k tomu, že třída kontroleru je naprogramována proti rozhraní, můžete předat novou implementaci IMovieRepository
třídy kontroleru a třída bude nadále fungovat.
Kromě toho, pokud chcete testovat MoviesController
třídu, můžete předat třídu falešného úložiště filmů do HomeController
. Můžete implementovat IMovieRepository
třídu s třídou, která ve skutečnosti nemá přístup k databázi, ale obsahuje všechny požadované metody IMovieRepository
rozhraní. Tímto způsobem můžete testovat jednotku MoviesController
třídy bez skutečného přístupu k reálné databázi.
Souhrn
Cílem tohoto kurzu bylo předvést, jak můžete vytvářet třídy modelů MVC s využitím microsoft LINQ to SQL. Prozkoumali jsme dvě strategie zobrazení databázových dat v aplikaci ASP.NET MVC. Nejprve jsme vytvořili třídy LINQ to SQL a použili je přímo v rámci akce kontroleru. Použití LINQ to SQL tříd v rámci kontroleru umožňuje rychle a snadno zobrazit data databáze v aplikaci MVC.
Dále jsme prozkoumali o něco obtížnější, ale rozhodně výkonnější cestu pro zobrazení databázových dat. Využili jsme vzor úložiště a umístili veškerou logiku přístupu k databázi do samostatné třídy úložiště. V kontroleru jsme napsali veškerý kód proti rozhraní místo konkrétní třídy. Výhodou modelu úložiště je, že nám v budoucnu umožňuje snadno změnit technologie přístupu k databázi a snadno testovat třídy kontroleru.