Sdílet prostřednictvím


Vytvoření tříd modelu pomocí LINQ to SQL (C#)

od Microsoftu

Stáhnout PDF

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).

Přidání nové databáze SQL Server

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.

Snímek obrazovky s oknem Průzkumníka serveru, který ukazuje, že složka Tabulky je v hierarchii složek zvýrazněná.

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).

Snímek obrazovky s oknem sady Microsoft Visual Studio zobrazující funkci Designer tabulky

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).

Vytváření tříd LINQ to SQL

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).

Použití Návrhář relací objektů

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 tblMovienazý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 () MovieDataContextk 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 modelMovie 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 movievlastnost .

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).

Vkládání filmů

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.

Zobrazení filmů pomocí zobrazení rejstříku

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.