Tworzenie klas modeli za pomocą modelu LINQ to SQL (VB)

przez Microsoft

Pobierz plik PDF

Celem tego samouczka jest wyjaśnienie jednej metody tworzenia klas modelu dla aplikacji ASP.NET MVC. W tym samouczku dowiesz się, jak tworzyć klasy modelu i wykonywać dostęp do bazy danych, korzystając z programu Microsoft LINQ do języka SQL.

Celem tego samouczka jest wyjaśnienie jednej metody tworzenia klas modelu dla aplikacji ASP.NET MVC. W tym samouczku dowiesz się, jak tworzyć klasy modelu i wykonywać dostęp do bazy danych, korzystając z programu Microsoft LINQ do języka SQL.

W tym samouczku tworzymy podstawową aplikację bazy danych Movie. Zaczynamy od utworzenia aplikacji bazy danych Movie w najszybszy i najprostszy możliwy sposób. Wykonujemy cały nasz dostęp do danych bezpośrednio z naszych działań administratora.

Następnie dowiesz się, jak używać wzorca repozytorium. Korzystanie ze wzorca repozytorium wymaga trochę więcej pracy. Jednak zaletą przyjęcia tego wzorca jest to, że umożliwia tworzenie aplikacji, które można dostosować do zmiany i można łatwo przetestować.

Co to jest klasa modelu?

Model MVC zawiera wszystkie logiki aplikacji, która nie jest zawarta w widoku MVC lub kontrolerze MVC. W szczególności model MVC zawiera wszystkie usługi aplikacji i logiki dostępu do danych.

Można użyć różnych technologii do zaimplementowania logiki dostępu do danych. Na przykład można utworzyć klasy dostępu do danych przy użyciu microsoft entity framework, NHibernate, Subsonic lub ADO.NET klas.

W tym samouczku używam LINQ do SQL do kwerendy i aktualizacji bazy danych. LINQ do SQL zapewnia bardzo łatwą metodę interakcji z bazą danych programu Microsoft SQL Server. Jednak ważne jest, aby zrozumieć, że ASP.NET framework MVC nie jest związany z LINQ do SQL w jakikolwiek sposób. ASP.NET MVC jest kompatybilny z dowolną technologią dostępu do danych.

Tworzenie bazy danych filmów

W tym samouczku -- w celu zilustrowania, jak można tworzyć klasy modelu — tworzymy prostą aplikację bazy danych Movie. Pierwszym krokiem jest utworzenie nowej bazy danych. Kliknij prawym przyciskiem myszy folder Dane aplikacji_w oknie Eksploratora rozwiązań i wybierz opcję menu Dodaj nowy element. Wybierz szablon bazy danych programu SQL Server, nadaj mu nazwę MoviesDB.mdf i kliknij przycisk Dodaj (patrz Rysunek 1).

Dodawanie nowej bazy danych programu SQL Server

Rysunek 01: Dodawanie nowej bazy danych programu SQL Server(kliknij, aby wyświetlić pełnowymiarowy obraz)

Po utworzeniu nowej bazy danych można ją otworzyć, klikając dwukrotnie plik MoviesDB.mdf w folderze Dane aplikacji._ Dwukrotne kliknięcie pliku MoviesDB.mdf powoduje otwarcie okna Eksploratora serwerów (patrz Rysunek 2).

Okno Eksploratora serwera jest nazywane oknem Eksploratora baz danych podczas korzystania z programu Visual Web Developer.

Korzystanie z okna Eksploratora serwera

Rysunek 02: Korzystanie z okna Eksploratora serwera(Kliknij, aby wyświetlić pełnowymiarowy obraz)

Musimy dodać jedną tabelę do naszej bazy danych, która reprezentuje nasze filmy. Kliknij prawym przyciskiem myszy folder Tabele i wybierz opcję menu Dodaj nową tabelę. Wybranie tej opcji menu powoduje otwarcie projektanta tabel (patrz rysunek 3).

Korzystanie z okna Eksploratora serwera

Rysunek 03: Projektant tabel(Kliknij, aby wyświetlić pełnowymiarowy obraz)

Musimy dodać następujące kolumny do naszej tabeli bazy danych:

Nazwa kolumny Typ danych Zezwalaj na wartości null
Identyfikator int False
Tytuł Nvarchar(200) False
Dyrektor Nvarchar(50) False

Musisz zrobić dwie specjalne rzeczy do kolumny Id. Najpierw należy oznaczyć kolumnę Id jako kolumnę klucza podstawowego, zaznaczając kolumnę w Projektancie tabel i klikając ikonę klucza. LINQ do SQL wymaga określenia kolumn klucza podstawowego podczas wykonywania wstawia lub aktualizacji do bazy danych.

Następnie należy oznaczyć kolumnę Id jako kolumnę Tożsamość, przypisując wartość Tak do właściwości Jest tożsamość (zobacz rysunek 3). Kolumna Tożsamość to kolumna, która jest automatycznie przypisywana do nowego numeru przy każdym dodaniu nowego wiersza danych do tabeli.

Po dokonaniu tych zmian zapisz tabelę o nazwie tblMovie. Tabelę można zapisać, klikając przycisk Zapisz.

Tworzenie klas LINQ do SQL

Nasz model MVC będzie zawierać LINQ do klas SQL, które reprezentują tabelę bazy danych tblMovie. Najprostszym sposobem utworzenia tych klas LINQ do SQL jest kliknięcie prawym przyciskiem myszy folderu Modele, wybranieopcji Dodaj, Nowy element , wybranie szablonu LINQ do klas SQL, nadanie klasom nazwy Movie.dbml i kliknięcie przycisku Dodaj (patrz Rysunek 4).

Tworzenie linq do klas SQL

Rysunek 04: Tworzenie LINQ do klas SQL(Kliknij, aby wyświetlić pełnowymiarowy obraz)

Natychmiast po utworzeniu Movie LINQ do klas SQL pojawia się projektant relacyjne obiektu. Tabele bazy danych z okna Eksploratora serwera można przeciągać do projektanta relacyjnego obiektu, aby utworzyć linq do klas SQL, które reprezentują określone tabele bazy danych. Musimy dodać tabelę bazy danych tblMovie do projektanta relacyjnego obiektu (patrz rysunek 4).

Korzystanie z projektanta relacyjnego obiektu

Rysunek 05: Korzystanie z projektanta relacyjnego obiektu(kliknij, aby wyświetlić obraz pełnowymiarowy)

Domyślnie Projektant relacyjne obiektu tworzy klasę o takiej samej nazwie jak tabela bazy danych, która jest przeciągana na Projektanta. Jednak nie chcemy nazywać naszą klasą tblMovie. W związku z tym kliknij nazwę klasy w Designer i zmień nazwę klasy na Movie.

Na koniec należy pamiętać, aby kliknąć przycisk Zapisz (obraz dyskietki), aby zapisać LINQ do klas SQL. W przeciwnym razie LINQ do klas SQL nie będą generowane przez projektanta relacyjnego obiektu.

Używanie linq do sql w akcji kontrolera

Teraz, gdy mamy nasze LINQ do klas SQL, możemy użyć tych klas do pobierania danych z bazy danych. W tej sekcji dowiesz się, jak używać LINQ do klas SQL bezpośrednio w ramach akcji kontrolera. Listę filmów z tabeli bazy danych tblMovies wyświetlimy w widoku MVC.

Najpierw musimy zmodyfikować HomeController klasy. Tę klasę można znaleźć w folderze Kontrolery aplikacji. Zmodyfikuj klasę tak, aby wyglądała jak klasa w aukcji 1.

Lista 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

Akcja Index() w wykazie 1 używa linq do SQL DataContext klasy (MovieDataContext) do reprezentowania bazy danych MoviesDB. Klasa MoveDataContext została wygenerowana przez projektanta relacyjnego obiektu programu Visual Studio.

Kwerenda LINQ jest wykonywana względem DataContext, aby pobrać wszystkie filmy z tabeli bazy danych tblMovies. Lista filmów jest przypisana do zmiennej lokalnej o nazwie filmy. Na koniec lista filmów jest przekazywana do widoku za pośrednictwem danych widoku.

Aby wyświetlić filmy, musimy następnie zmodyfikować widok indeksu. Widok Indeksu można znaleźć w folderze Widoki\Strona główna. Zaktualizuj widok indeksu, tak aby wyglądał jak widok w aukcji 2.

Lista 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>

Należy zauważyć, że zmodyfikowany <widok indeksu> zawiera %@ importuj obszar nazw % dyrektywy w górnej części widoku. Ta dyrektywa importuje obszar nazw MvcApplication1. Potrzebujemy tej przestrzeni nazw, aby pracować z klasami modelu — w szczególności Movie class -- w widoku.

Widok w aukcji 2 zawiera for each pętli, która iteruje za pośrednictwem wszystkich elementów reprezentowanych przez ViewData.Model właściwości. Wartość Title właściwości jest wyświetlany dla każdego filmu.

Należy zauważyć, że wartość ViewData.Model właściwość jest rzutowanie do IEnumerable. Jest to konieczne w celu pętli przez zawartość ViewData.Model. Inną opcją jest utworzenie widoku silnie typizowanego. Podczas tworzenia widoku silnie typizowane, rzutowania ViewData.Model właściwości do określonego typu w widoku klasy związanej z kodem.

Jeśli uruchomisz aplikację po zmodyfikowaniu HomeController klasy i widoku indeksu, a następnie otrzymasz pustą stronę. Otrzymasz pustą stronę, ponieważ w tabeli bazy danych tblMovies nie ma żadnych rekordów filmowych.

Aby dodać rekordy do tabeli bazy danych tblMovies, kliknij prawym przyciskiem myszy tabelę bazy danych tblMovies w oknie Eksploratora serwerów (okno Eksplorator baz danych w programie Visual Web Developer) i wybierz opcję menu Pokaż dane tabeli. Rekordy filmów można wstawiać za pomocą wyświetlanej siatki (patrz Rysunek 5).

Wstawianie filmów

Rysunek 06: Wstawianie filmów(Kliknij, aby wyświetlić pełnowymiarowy obraz)

Po dodaniu niektórych rekordów bazy danych do tabeli tblMovies i uruchomieniu aplikacji zostanie wyświetlona strona na rysunku 7. Wszystkie rekordy bazy danych filmów są wyświetlane na liście punktowanej.

Wyświetlanie filmów z widokiem indeksu

Rysunek 07: Wyświetlanie filmów z widokiem indeksu(Kliknij, aby wyświetlić pełnowymiarowy obraz)

Korzystanie ze wzorca repozytorium

W poprzedniej sekcji użyliśmy LINQ do klas SQL bezpośrednio w ramach akcji kontrolera. Użyliśmy MovieDataContext klasy bezpośrednio z index() działania kontrolera. Nie ma nic złego w robieniu tego w przypadku prostej aplikacji. Jednak praca bezpośrednio z LINQ do SQL w klasie kontrolera tworzy problemy, gdy trzeba utworzyć bardziej złożoną aplikację.

Za pomocą LINQ do SQL w klasie kontrolera utrudnia przełączanie technologii dostępu do danych w przyszłości. Na przykład można zdecydować się na przejście z korzystania z microsoft linq do języka SQL do korzystania z programu Microsoft Entity Framework jako technologii dostępu do danych. W takim przypadku należy przepisać każdy kontroler, który uzyskuje dostęp do bazy danych w aplikacji.

Za pomocą LINQ do SQL w klasie kontrolera również utrudnia tworzenie testów jednostkowych dla aplikacji. Zwykle nie chcesz wchodzić w interakcje z bazą danych podczas wykonywania testów jednostkowych. Chcesz użyć testów jednostkowych do testowania logiki aplikacji, a nie serwera bazy danych.

Aby utworzyć aplikację MVC, która jest bardziej elastyczna do przyszłych zmian i która może być łatwiej testowana, należy rozważyć użycie wzorca repozytorium. Korzystając ze wzorca repozytorium, należy utworzyć oddzielną klasę repozytorium, która zawiera całą logikę dostępu do bazy danych.

Podczas tworzenia klasy repozytorium, należy utworzyć interfejs, który reprezentuje wszystkie metody używane przez klasę repozytorium. W obrębie kontrolerów można napisać kod w interfejsie zamiast repozytorium. W ten sposób można zaimplementować repozytorium przy użyciu różnych technologii dostępu do danych w przyszłości.

Interfejs w aukcji 3 nosi nazwę IMovieRepository i reprezentuje pojedynczą metodę o nazwie ListAll().

Lista 3 –Models\IMovieRepository.vb

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

Klasa repozytorium w aukcji 4 implementuje interfejs IMovieRepository. Należy zauważyć, że zawiera metodę o nazwie ListAll(), która odpowiada metodzie wymaganej przez interfejs IMovieRepository.

Lista 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

Na koniec MoviesController klasy w aukcji 5 używa wzorca repozytorium. Nie używa już LINQ do klas SQL bezpośrednio.

Lista 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
}

Należy zauważyć, że MoviesController klasy w aukcji 5 ma dwa konstruktory. Pierwszy konstruktor, konstruktor bez parametrów, jest wywoływana, gdy aplikacja jest uruchomiona. Ten konstruktor tworzy wystąpienie MovieRepository klasy i przekazuje go do drugiego konstruktora.

Drugi konstruktor ma jeden parametr: parametr IMovieRepository. Ten konstruktor po prostu przypisuje wartość parametru do _pola na poziomie klasy o nazwie repozytorium.

MoviesController Klasa korzysta z wzorca projektowania oprogramowania o nazwie wzorzec iniekcji zależności. W szczególności jest przy użyciu czegoś o nazwie iniekcji zależności konstruktora. Możesz przeczytać więcej o tym wzorze, czytając następujący artykuł Martin Fowler:

http://martinfowler.com/articles/injection.html

Należy zauważyć, że cały kod w MoviesController klasy (z wyjątkiem pierwszego konstruktora) współdziała z interfejsem IMovieRepository zamiast rzeczywistej MovieRepository klasy. Kod współdziała z interfejsem abstrakcyjnym zamiast konkretnej implementacji interfejsu.

Jeśli chcesz zmodyfikować technologię dostępu do danych używaną przez aplikację, możesz po prostu zaimplementować interfejs IMovieRepository z klasą, która korzysta z alternatywnej technologii dostępu do bazy danych. Na przykład można utworzyć klasę EntityFrameworkMovieRepository lub klasę SubSonicMovieRepository. Ponieważ klasa kontrolera jest zaprogramowany względem interfejsu, można przekazać nową implementację IMovieRepository do klasy kontrolera i klasa będzie nadal działać.

Ponadto jeśli chcesz przetestować MoviesController klasy, a następnie można przekazać fałszywe repozytorium filmu klasy do MoviesController. Klasę IMovieRepository można zaimplementować z klasą, która w rzeczywistości nie uzyskuje dostępu do bazy danych, ale zawiera wszystkie wymagane metody interfejsu IMovieRepository. W ten sposób można jednostkowo przetestować MoviesController klasy bez faktycznie dostęp do prawdziwej bazy danych.

Podsumowanie

Celem tego samouczka było zademonstrowanie, jak można tworzyć klasy modelu MVC, korzystając z programu Microsoft LINQ do języka SQL. Zbadaliśmy dwie strategie wyświetlania danych bazy danych w aplikacji ASP.NET MVC. Najpierw utworzyliśmy LINQ do klas SQL i użyliśmy klas bezpośrednio w ramach akcji kontrolera. Za pomocą LINQ do klas SQL w ramach kontrolera umożliwia szybkie i łatwe wyświetlanie danych bazy danych w aplikacji MVC.

Następnie zbadaliśmy nieco trudniejszą, ale zdecydowanie bardziej cnotliwą ścieżkę do wyświetlania danych bazy danych. Skorzystaliśmy ze wzorca repozytorium i umieściliśmy całą logikę dostępu do bazy danych w osobnej klasie repozytorium. W naszym kontrolerze napisaliśmy cały nasz kod względem interfejsu zamiast konkretnej klasy. Zaletą wzorca repozytorium jest to, że umożliwia nam łatwą zmianę technologii dostępu do bazy danych w przyszłości i umożliwia nam łatwe testowanie naszych klas kontrolerów.