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

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 microsoft 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, na kterém je zvýrazněná složka Tabulky v hierarchii složek

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.

Po provedení těchto změn uložte tabulku s názvem tblMovie. Tabulku můžete uložit kliknutím na tlačítko Uložit.

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

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ší třídě říkat tblMovie. 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.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

Akce Index() ve výpisu 1 používá třídu LINQ to SQL DataContext (MovieDataContext) k reprezentaci databáze MoviesDB. Třída MoveDataContext byla vygenerována sadou Visual Studio Návrhář relací objektů.

Provede se dotaz LINQ na DataContext, který načte všechny filmy z tabulky databáze tblMovies. Seznam filmů je přiřazen k místní proměnné s názvem filmy. 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 složce Views\Home\. Aktualizujte zobrazení indexu tak, aby vypadalo jako zobrazení ve výpisu 2.

Výpis 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>

Všimněte si, že upravené zobrazení indexu <obsahuje v horní části zobrazení direktivu %@ import namespace %> . Tato direktiva importuje obor názvů MvcApplication1. Tento obor názvů potřebujeme pro práci s třídami modelu – zejména s třídou Movie – v zobrazení.

Zobrazení v výpisu 2 obsahuje for each smyčku, která iteruje všechny položky reprezentované ViewData.Model vlastnost. Hodnota vlastnosti Title se zobrazí pro každé video.

Všimněte si, že hodnota ViewData.Model vlastnost je přetypován na IEnumerable. To je nezbytné pro procházení obsahu ViewData.Model. Další možností je vytvořit zobrazení se silnými typy. Při vytváření zobrazení silného typu přetypujete vlastnost ViewData.Model na konkrétní typ ve třídě kódu na pozadí zobrazení.

Pokud aplikaci spustíte po úpravě třídy HomeController a zobrazení Index, zobrazí se prázdná stránka. Zobrazí se prázdná stránka, protože v databázové tabulce tblMovies nejsou žádné filmové záznamy.

Chcete-li přidat záznamy do tabulky databáze tblMovies, klikněte pravým tlačítkem myši na tabulku databáze tblMovies 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. Filmové záznamy můžete vložit pomocí mřížky, která se zobrazí (viz Obrázek 5).

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 tabulky tblMovies 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 jsme třídu MovieDataContext přímo z akce kontroleru Index(). 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.vb

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

Třída úložiště ve výpisu 4 implementuje rozhraní IMovieRepository. Všimněte si, že obsahuje metodu s názvem ListAll(), která odpovídá metodě vyžadované rozhraním IMovieRepository.

Výpis 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

Nakonec Třída MoviesController ve výpisu 5 používá model Repository. Už nepoužívá LINQ to SQL třídy přímo.

Výpis 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
}

Všimněte si, že Třída MoviesController ve výpisu 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: parametr IMovieRepository. Tento konstruktor jednoduše přiřadí hodnotu parametru k poli 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 v MovieController třídy (s výjimkou prvního konstruktoru) pracuje 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 rozhraní IMovieRepository s třídou, která používá alternativní technologii přístupu k databázi. Můžete například vytvořit třídu EntityFrameworkMovieRepository nebo Třídu SubSonicMovieRepository. Vzhledem k tomu, že třída kontroleru je naprogramována proti rozhraní, můžete předat novou implementaci IMovieRepository kontroleru třídy a třída bude i nadále fungovat.

Kromě toho, pokud chcete test MoviesController třídy, můžete předat falešné video úložiště třídy MoviesController. Můžete implementovat IMovieRepository třídy, 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 Třídu MoviesController 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.