Tworzenie klas modeli za pomocą programu Entity Framework (VB)

autor: Microsoft

Z tego samouczka dowiesz się, jak używać ASP.NET MVC z programem Microsoft Entity Framework. Dowiesz się, jak za pomocą Kreatora jednostek utworzyć model danych jednostki ADO.NET. W ramach tego samouczka utworzymy aplikację internetową, która ilustruje sposób wybierania, wstawiania, aktualizowania i usuwania danych bazy danych przy użyciu programu Entity Framework.

Celem tego samouczka jest wyjaśnienie sposobu tworzenia klas dostępu do danych przy użyciu programu Microsoft Entity Framework podczas tworzenia aplikacji MVC ASP.NET. W tym samouczku założono, że nie ma wcześniejszej wiedzy na temat programu Microsoft Entity Framework. Po ukończeniu tego samouczka dowiesz się, jak używać programu Entity Framework do wybierania, wstawiania, aktualizowania i usuwania rekordów bazy danych.

Microsoft Entity Framework to narzędzie mapowania relacyjnego obiektów (O/RM), które umożliwia automatyczne generowanie warstwy dostępu do danych z bazy danych. Platforma Entity Framework pozwala uniknąć żmudnej pracy tworzenia klas dostępu do danych ręcznie.

Uwaga

Nie ma podstawowego połączenia między ASP.NET MVC a programem Microsoft Entity Framework. Istnieje kilka alternatyw dla programu Entity Framework, których można używać z ASP.NET MVC. Można na przykład utworzyć klasy modelu MVC przy użyciu innych narzędzi O/RM, takich jak Microsoft LINQ to SQL, NHibernate lub SubSonic.

Aby zilustrować, jak można używać programu Microsoft Entity Framework z ASP.NET MVC, utworzymy prostą przykładową aplikację. Utworzymy aplikację Bazy danych filmów, która umożliwia wyświetlanie i edytowanie rekordów bazy danych filmów.

W tym samouczku założono, że masz program Visual Studio 2008 lub Visual Web Developer 2008 z dodatkiem Service Pack 1. Do korzystania z programu Entity Framework jest potrzebny dodatek Service Pack 1. Program Visual Studio 2008 z dodatkiem Service Pack 1 lub Visual Web Developer z dodatkiem Service Pack 1 można pobrać z następującego adresu:

https://www.asp.net/downloads/

Tworzenie przykładowej bazy danych movie

Aplikacja Movie Database używa tabeli bazy danych o nazwie Filmy, która zawiera następujące kolumny:

Nazwa kolumny Typ danych Czy zezwalać na wartości null? Czy klucz podstawowy?
Id int Fałsz Prawda
Tytuł nvarchar(100) Fałsz Fałsz
Dyrektor nvarchar(100) Fałsz Fałsz

Tę tabelę można dodać do projektu ASP.NET MVC, wykonując następujące kroki:

  1. Kliknij prawym przyciskiem myszy folder App_Data w oknie Eksplorator rozwiązań i wybierz opcję menu Dodaj, Nowy element.
  2. W oknie dialogowym Dodawanie nowego elementu wybierz pozycję SQL Server Baza danych, nadaj bazie danych nazwę MoviesDB.mdf, a następnie kliknij przycisk Dodaj.
  3. Kliknij dwukrotnie plik MoviesDB.mdf, aby otworzyć okno Eksplorator serwera/Eksplorator bazy danych.
  4. Rozwiń połączenie bazy danych MoviesDB.mdf, kliknij prawym przyciskiem myszy folder Tables i wybierz opcję menu Dodaj nową tabelę.
  5. W Projektant tabeli dodaj kolumny Id (Identyfikator), Title (Tytuł) i Director (Dyrektor).
  6. Kliknij przycisk Zapisz (ma ikonę dyskietki), aby zapisać nową tabelę o nazwie Filmy.

Po utworzeniu tabeli bazy danych Filmy należy dodać do tabeli przykładowe dane. Kliknij prawym przyciskiem myszy tabelę Filmy i wybierz opcję menu Pokaż dane tabeli. Możesz wprowadzić fałszywe dane filmowe w wyświetlonej siatce.

Tworzenie modelu danych jednostki ADO.NET

Aby móc korzystać z programu Entity Framework, należy utworzyć model danych jednostki. Możesz skorzystać z Kreatora modelu danych jednostek programu Visual Studio, aby automatycznie wygenerować model danych jednostki z bazy danych.

Wykonaj następujące kroki:

  1. Kliknij prawym przyciskiem myszy folder Models w oknie Eksplorator rozwiązań i wybierz opcję menu Dodaj nowy element.
  2. W oknie dialogowym Dodawanie nowego elementu wybierz kategorię Dane (zobacz Rysunek 1).
  3. Wybierz szablon modelu danych jednostki ADO.NET , nadaj modelowi danych jednostki nazwę MoviesDBModel.edmx, a następnie kliknij przycisk Dodaj . Kliknięcie przycisku Dodaj umożliwia uruchomienie Kreatora modelu danych.
  4. W kroku Wybieranie zawartości modelu wybierz opcję Generuj z bazy danych i kliknij przycisk Dalej (zobacz Rysunek 2).
  5. W kroku Wybierz połączenie danych wybierz połączenie bazy danych MoviesDB.mdf, wprowadź nazwę ustawień połączenia jednostek MoviesDBEntities, a następnie kliknij przycisk Dalej (zobacz Rysunek 3).
  6. W kroku Wybieranie obiektów bazy danych wybierz tabelę Baza danych Movie i kliknij przycisk Zakończ (zobacz Rysunek 4).

Po wykonaniu tych kroków zostanie otwarty ADO.NET Entity Data Model Projektant (Entity Projektant).

Rysunek 1. Tworzenie nowego modelu danych jednostki

clip_image002

Rysunek 2. Wybieranie kroku zawartości modelu

clip_image004

Rysunek 3. Wybieranie połączenia danych

clip_image006

Rysunek 4. Wybieranie obiektów bazy danych

clip_image008

Modyfikowanie modelu danych jednostki ADO.NET

Po utworzeniu modelu danych jednostki można zmodyfikować model, korzystając z Projektant jednostki (zobacz Rysunek 5). Jednostkę Projektant można otworzyć w dowolnym momencie, klikając dwukrotnie plik MoviesDBModel.edmx znajdujący się w folderze Models w oknie Eksplorator rozwiązań.

Rysunek 5. Model danych jednostki ADO.NET Projektant

clip_image010

Na przykład można użyć Projektant Entity, aby zmienić nazwy klas generowanych przez Kreatora danych modelu jednostek. Kreator utworzył nową klasę dostępu do danych o nazwie Filmy. Innymi słowy, Kreator nadał klasie taką samą nazwę jak tabela bazy danych. Ponieważ użyjemy tej klasy do reprezentowania określonego wystąpienia filmu, należy zmienić nazwę klasy z Filmy na Movie.

Jeśli chcesz zmienić nazwę klasy jednostki, możesz kliknąć dwukrotnie nazwę klasy w Projektant jednostki i wprowadzić nową nazwę (zobacz Rysunek 6). Alternatywnie możesz zmienić nazwę jednostki w okno Właściwości po wybraniu jednostki w Projektant jednostki.

Rysunek 6. Zmienianie nazwy jednostki

clip_image012

Pamiętaj, aby zapisać model danych jednostki po wprowadzeniu modyfikacji, klikając przycisk Zapisz (ikonę dyskietki). W tle Projektant Entity generuje zestaw klas .NET języka Visual Basic. Te klasy można wyświetlić, otwierając model MoviesDBModel. plik Projektant.vb z okna Eksplorator rozwiązań.

Nie modyfikuj kodu w pliku Projektant.vb, ponieważ zmiany zostaną zastąpione przy następnym użyciu Projektant jednostki. Jeśli chcesz rozszerzyć funkcjonalność klas jednostek zdefiniowanych w pliku Projektant.vb, możesz utworzyć klasy częściowe w oddzielnych plikach.

Wybieranie rekordów bazy danych za pomocą programu Entity Framework

Zacznijmy kompilować aplikację Bazy danych filmów, tworząc stronę zawierającą listę rekordów filmowych. Kontroler domu na liście 1 uwidacznia akcję o nazwie Index(). Akcja Index() zwraca wszystkie rekordy filmów z tabeli bazy danych Movie, korzystając z platformy Entity Framework.

Lista 1 — Controllers\HomeController.vb

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Private _db As MoviesDBEntities

    Public Sub New()
        _db = New MoviesDBEntities()
    End Sub

    Public Function Index()
        ViewData.Model = _db.MovieSet.ToList()
        Return View()
    End Function

End Class

Zwróć uwagę, że kontroler na liście 1 zawiera konstruktor. Konstruktor inicjuje pole na poziomie klasy o nazwie _db. Pole _db reprezentuje jednostki bazy danych wygenerowane przez program Microsoft Entity Framework. Pole _db to wystąpienie klasy MoviesDBEntities wygenerowanej przez jednostkę Projektant.

Pole _db jest używane w ramach akcji Index(), aby pobrać rekordy z tabeli bazy danych Filmy. Wyrażenie _db. Zestaw MovieSet reprezentuje wszystkie rekordy z tabeli bazy danych Filmy. Metoda ToList() służy do konwertowania zestawu filmów na ogólną kolekcję obiektów Movie: List( Of Movie).

Rekordy filmów są pobierane z pomocą LINQ to Entities. Akcja Index() na liście 1 używa składni metody LINQ do pobierania zestawu rekordów bazy danych. Jeśli wolisz, możesz zamiast tego użyć składni zapytań LINQ. Następujące dwie instrukcje wykonują te same czynności:

ViewData.Model = _db.MovieSet.ToList()
ViewData.Model = (from m in _db.MovieSet select m).ToList()

Użyj dowolnej składni LINQ — składni metody lub składni zapytania — która jest najbardziej intuicyjna. Nie ma różnicy w wydajności między dwoma podejściami — jedyną różnicą jest styl.

Widok w liście 2 służy do wyświetlania rekordów filmów.

Lista 2 — Views\Home\Index.aspx

<%@ Page Language="VB" 
  Inherits="System.Web.Mvc.ViewPage(Of List(Of MvcApplication1.Movie))" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Index</title>
</head>
<body>
    <div>
    
<%  For Each m In Model%>

    Title: <%= m.Title %>
    <br />
    Director: <%= m.Director %>
    <br />
    <%=Html.ActionLink("Edit", "Edit", New With {.id = m.Id})%>
    <%=Html.ActionLink("Delete", "Delete", New With {.id = m.Id})%>
       
        <hr />
<% Next%>
    
    <%= Html.ActionLink("Add Movie", "Add") %>
    
    </div>
</body>
</html>

Widok w liście 2 zawiera pętlę For Each , która iteruje po każdym rekordzie filmu i wyświetla wartości właściwości Tytuł i Reżyser rekordu filmu. Zwróć uwagę, że obok każdego rekordu jest wyświetlane łącze Edytuj i Usuń. Ponadto link Dodaj film jest wyświetlany w dolnej części widoku (zobacz Rysunek 7).

Rysunek 7. Widok indeksu

clip_image014

Widok indeksu jest widokiem wpisanym. Widok Indeks ma dyrektywę <%@ Page %> zawierającą atrybut Inherits. Atrybut Inherits rzutuje właściwość ViewData.Model na silnie typizowany ogólny zbiór list obiektów Movie — List(Of Movie).

Wstawianie rekordów bazy danych za pomocą programu Entity Framework

Możesz użyć programu Entity Framework, aby ułatwić wstawianie nowych rekordów do tabeli bazy danych. Lista 3 zawiera dwie nowe akcje dodane do klasy kontrolera Home, których można użyć do wstawiania nowych rekordów do tabeli bazy danych Movie.

Lista 3 — Controllers\HomeController.vb (Dodaj metody)

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Public Function Add()
        Return View()
    End Function

    <AcceptVerbs(HttpVerbs.Post)> _
    Public Function Add(ByVal form As FormCollection)
        Dim movieToAdd As New Movie()

        ' Deserialize (Include white list!)
        TryUpdateModel(movieToAdd, New String() {"Title", "Director"}, form.ToValueProvider())

        ' Validate
        If String.IsNullOrEmpty(movieToAdd.Title) Then
            ModelState.AddModelError("Title", "Title is required!")
        End If
        If String.IsNullOrEmpty(movieToAdd.Director) Then
            ModelState.AddModelError("Director", "Director is required!")
        End If

        ' If valid, save movie to database
        If (ModelState.IsValid) Then
            _db.AddToMovieSet(movieToAdd)
            _db.SaveChanges()
            Return RedirectToAction("Index")
        End If

        ' Otherwise, reshow form
        Return View(movieToAdd)
    End Function

End Class

Pierwsza akcja Add() po prostu zwraca widok. Widok zawiera formularz do dodawania nowego rekordu bazy danych filmów (zobacz Rysunek 8). Po przesłaniu formularza jest wywoływana druga akcja Add().

Zwróć uwagę, że druga akcja Add() jest ozdobiona atrybutem AcceptVerbs. Tę akcję można wywołać tylko podczas wykonywania operacji HTTP POST. Innymi słowy, tę akcję można wywołać tylko podczas publikowania formularza HTML.

Druga akcja Add() tworzy nowe wystąpienie klasy Entity Framework Movie za pomocą metody ASP.NET MVC TryUpdateModel(). Metoda TryUpdateModel() przyjmuje pola w metodzie FormCollection przekazanej do metody Add() i przypisuje wartości tych pól formularza HTML do klasy Movie.

W przypadku korzystania z programu Entity Framework należy podać "bezpieczną listę" właściwości podczas używania metod TryUpdateModel lub UpdateModel w celu zaktualizowania właściwości klasy jednostki.

Następnie akcja Add() wykonuje prostą walidację formularza. Akcja sprawdza, czy właściwości Tytuł i Dyrektor mają wartości. Jeśli wystąpi błąd weryfikacji, do elementu ModelState zostanie dodany komunikat o błędzie weryfikacji.

Jeśli nie ma błędów walidacji, nowy rekord filmu zostanie dodany do tabeli bazy danych Filmy za pomocą programu Entity Framework. Nowy rekord jest dodawany do bazy danych z następującymi dwoma wierszami kodu:

_db.AddToMovieSet(movieToAdd)
_db.SaveChanges()

Pierwszy wiersz kodu dodaje nową jednostkę Movie do zestawu filmów śledzonych przez program Entity Framework. Drugi wiersz kodu zapisuje zmiany wprowadzone w filmach śledzonych z powrotem do bazowej bazy danych.

Rysunek 8 — Widok dodawania

clip_image016

Aktualizowanie rekordów bazy danych za pomocą programu Entity Framework

Możesz wykonać niemal takie samo podejście, aby edytować rekord bazy danych za pomocą programu Entity Framework jako podejście, które właśnie wykonaliśmy, aby wstawić nowy rekord bazy danych. Lista 4 zawiera dwie nowe akcje kontrolera o nazwie Edit(). Pierwsza akcja Edit() zwraca formularz HTML do edycji rekordu filmu. Druga akcja Edit() próbuje zaktualizować bazę danych.

Wyświetlanie listy 4 — Controllers\HomeController.vb (metody edycji)

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Public Function Edit(ByVal id As Integer)
        ' Get movie to update
        Dim movieToUpdate As Movie = _db.MovieSet.First(Function(m) m.Id = id)
        ViewData.Model = movieToUpdate
        Return View()
    End Function

    <AcceptVerbs(HttpVerbs.Post)> _
    Public Function Edit(ByVal form As FormCollection)

        ' Get movie to update
        Dim id As Integer = Integer.Parse(form("id"))
        Dim movieToUpdate As Movie = _db.MovieSet.First(Function(m) m.Id = id)

        ' Deserialize (Include white list!)
        TryUpdateModel(movieToUpdate, New String() {"Title", "Director"}, form.ToValueProvider)

        ' Validate
        If String.IsNullOrEmpty(movieToUpdate.Title) Then
            ModelState.AddModelError("Title", "Title is required!")
        End If
        If String.IsNullOrEmpty(movieToUpdate.Director) Then
            ModelState.AddModelError("Director", "Director is required!")
        End If

        ' If valid, save movie to database
        If (ModelState.IsValid) Then
            _db.SaveChanges()
            Return RedirectToAction("Index")
        End If

        ' Otherwise, reshow form
        Return View(movieToUpdate)
    End Function

End Class

Druga akcja Edit() rozpoczyna się od pobrania rekordu Movie z bazy danych zgodnego z identyfikatorem edytowanego filmu. Następująca instrukcja LINQ to Entities pobiera pierwszy rekord bazy danych zgodny z określonym identyfikatorem:

Dim movieToUpdate As Movie = _db.MovieSet.First(Function(m) m.Id = id)

Następnie metoda TryUpdateModel() służy do przypisywania wartości pól formularza HTML do właściwości jednostki filmowej. Zwróć uwagę, że lista bezpiecznych jest dostarczana w celu określenia dokładnych właściwości do zaktualizowania.

Następnie wykonywana jest prosta walidacja w celu sprawdzenia, czy zarówno właściwości Tytuł filmu, jak i Reżyser mają wartości. Jeśli brakuje żadnej właściwości, komunikat o błędzie walidacji zostanie dodany do elementu ModelState i ModelState.IsValid zwraca wartość false.

Na koniec, jeśli nie ma błędów walidacji, podstawowa tabela bazy danych Filmy zostanie zaktualizowana o wszelkie zmiany, wywołując metodę SaveChanges().

Podczas edytowania rekordów bazy danych należy przekazać identyfikator rekordu edytowanego do akcji kontrolera wykonującej aktualizację bazy danych. W przeciwnym razie akcja kontrolera nie będzie wiedzieć, który rekord ma być aktualizowany w bazowej bazie danych. Widok Edycja zawarty w liście 5 zawiera ukryte pole formularza reprezentujące identyfikator edytowanego rekordu bazy danych.

Lista 5 — Views\Home\Edit.aspx

<%@ Page Language="VB" Inherits="System.Web.Mvc.ViewPage(Of MvcApplication1.Movie)" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>Edit</title>
    <style type="text/css">
    
    .input-validation-error
    {
        background-color:Yellow;
    }
    
    </style>    
</head>
<body>
    <div>

<h1>Edit Movie</h1>

<form method="post" action="/Home/Edit">

    <!-- Include Hidden Id -->
    <%= Html.Hidden("id") %>

    Title:
    <br />
    <%= Html.TextBox("title") %>
    
    <br /><br />
    Director:
    <br />
    <%= Html.TextBox("director") %>
    
    <br /><br />
    <input type="submit" value="Edit Movie" />
</form>
    
    </div>
</body>
</html>

Usuwanie rekordów bazy danych za pomocą programu Entity Framework

Ostateczna operacja bazy danych, którą musimy rozwiązać w tym samouczku, polega na usuwaniu rekordów bazy danych. Możesz użyć akcji kontrolera w liście 6, aby usunąć określony rekord bazy danych.

Wyświetlanie listy 6 — \Controllers\HomeController.vb (akcja Usuń)

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Public Function Delete(ByVal id As Integer)
        ' Get movie to delete
        Dim movieToDelete As Movie = _db.MovieSet.First(Function(m) m.Id = id)

        ' Delete 
        _db.DeleteObject(movieToDelete)
        _db.SaveChanges()

        ' Show Index view
        Return RedirectToAction("Index")
    End Function

End Class

Akcja Delete() najpierw pobiera jednostkę Movie zgodną z identyfikatorem przekazanym do akcji. Następnie film zostanie usunięty z bazy danych, wywołując metodę DeleteObject(), a następnie metodę SaveChanges(). Na koniec użytkownik jest przekierowywany z powrotem do widoku Indeks.

Podsumowanie

Celem tego samouczka było zademonstrowanie sposobu tworzenia aplikacji internetowych opartych na bazie danych dzięki wykorzystaniu ASP.NET MVC i microsoft Entity Framework. Wiesz już, jak utworzyć aplikację, która umożliwia wybieranie, wstawianie, aktualizowanie i usuwanie rekordów bazy danych.

Najpierw omówiliśmy sposób używania Kreatora modelu danych jednostek do generowania modelu danych jednostki z poziomu programu Visual Studio. Następnie dowiesz się, jak używać LINQ to Entities do pobierania zestawu rekordów bazy danych z tabeli bazy danych. Na koniec użyliśmy programu Entity Framework do wstawiania, aktualizowania i usuwania rekordów bazy danych.