Tworzenie klas modeli za pomocą programu Entity Framework (C#)

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 trakcie 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 ASP.NET MVC. W tym samouczku założono, że nie ma wcześniejszej wiedzy na temat programu Microsoft Entity Framework. Na koniec tego samouczka dowiesz się, jak używać platformy Entity Framework do wybierania, wstawiania, aktualizowania i usuwania rekordów bazy danych.

Program Microsoft Entity Framework to narzędzie do 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.

Aby zilustrować, jak można używać programu Microsoft Entity Framework z ASP.NET MVC, utworzymy prostą przykładową aplikację. Utworzymy aplikację usługi Movie Database, 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. Aby korzystać z programu Entity Framework, potrzebny jest dodatek Service Pack 1. Możesz pobrać program Visual Studio 2008 z dodatkiem Service Pack 1 lub Visual Web Developer z dodatkiem Service Pack 1 z następującego adresu:

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

Uwaga

Nie ma podstawowego połączenia między ASP.NET MVC a programem Microsoft Entity Framework. Istnieje kilka alternatyw dla platformy Entity Framework, których można użyć 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.

Tworzenie przykładowej bazy danych filmu

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 i 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 Identyfikator, Tytuł i 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 do wyświetlonej siatki.

Tworzenie modelu danych jednostki ADO.NET

Aby użyć platformy 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 uruchamia 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 i kliknij przycisk Dalej (zobacz Rysunek 3).
  6. W kroku Wybieranie obiektów bazy danych wybierz tabelę bazy danych Movie i kliknij przycisk Zakończ (zobacz Rysunek 4).

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

Rysunek 1. Tworzenie nowego modelu danych jednostek

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, powinniśmy zmienić nazwę klasy z Movie na Movie.

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

Rysunek 6. Zmienianie nazwy jednostki

clip_image012

Pamiętaj, aby zapisać model danych jednostki po wprowadzeniu modyfikacji, klikając przycisk Zapisz (ikonę dyskietki). Za kulisami Projektant Entity generuje zestaw klas języka C#. Możesz wyświetlić te klasy, otwierając model MoviesDBModel. plik Projektant.cs z okna Eksplorator rozwiązań.

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

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

Zacznijmy tworzyć naszą aplikację Movie Database, tworząc stronę, która wyświetla listę rekordów filmowych. Kontroler główny 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.cs

using System.Linq;
using System.Web.Mvc;
using MovieEntityApp.Models;

namespace MovieEntityApp.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        MoviesDBEntities _db;

        public HomeController()
        {
            _db = new MoviesDBEntities();
        }

        public ActionResult Index()
        {
            ViewData.Model = _db.MovieSet.ToList();
            return View();
        }

    }
}

Zwróć uwagę, że kontroler w 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 Projektant jednostki.

Aby użyć klasy theProjectsDBEntities na kontrolerze głównym, należy zaimportować przestrzeń nazw MovieEntityApp.Models (MVCProjectName). Modele).

Pole _db jest używane w 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 filmowych (List<Movie>).

Rekordy filmowe są pobierane z pomocą LINQ to Entities. Akcja Index() w pozycji List 1 używa składni metody LINQ w celu pobrania 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 filmowych.

Lista 2 — Views\Home\Index.aspx

<%@ Page Language="C#"  
  Inherits="System.Web.Mvc.ViewPage<List<MovieEntityApp.Models.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>
    
<% foreach (var m in ViewData.Model)
   { %>

    Title: <%= m.Title %>
    <br />
    Director: <%= m.Director %>
    <br />
    <%= Html.ActionLink("Edit", "Edit", new { id = m.Id })%>
    <%= Html.ActionLink("Delete", "Delete", new { id = m.Id })%>
       
        <hr />
<% } %>

<%= Html.ActionLink("Add Movie", "Add") %>
    
    </div>
</body>
</html>

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

Rysunek 7 . Widok indeksu

clip_image014

Widok indeksu jest widokiem wpisanym. Widok Indeks zawiera dyrektywę <%@ Page %> z atrybutem Dziedziczy , który rzutuje właściwość Model na silnie typizowane ogólne kolekcje listy obiektów filmowych (<Lista filmów).

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.cs (Dodawanie metod)

public ActionResult Add()
{
    return View();
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Add(FormCollection form)
{
    var movieToAdd = new Movie();

    // Deserialize (Include white list!)
    TryUpdateModel(movieToAdd, new string[] { "Title", "Director" }, form.ToValueProvider());

    // Validate
    if (String.IsNullOrEmpty(movieToAdd.Title))
        ModelState.AddModelError("Title", "Title is required!");
    if (String.IsNullOrEmpty(movieToAdd.Director))
        ModelState.AddModelError("Director", "Director is required!");

    // If valid, save movie to database
    if (ModelState.IsValid)
    {
        _db.AddToMovieSet(movieToAdd);
        _db.SaveChanges();
        return RedirectToAction("Index");
    }

    // Otherwise, reshow form
    return View(movieToAdd);
}

Pierwsza akcja Add() po prostu zwraca widok. Widok zawiera formularz do dodawania nowego rekordu bazy danych filmów (zobacz Rysunek 8). Podczas przesyłania formularza wywoływana jest 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, ta akcja może być wywoływana tylko podczas publikowania formularza HTML.

Druga akcja Add() tworzy nowe wystąpienie klasy Entity Framework Movie z 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, zostanie dodany komunikat o błędzie weryfikacji do elementu ModelState.

Jeśli nie ma błędów walidacji, nowy rekord filmowy zostanie dodany do tabeli bazy danych Filmy z 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 platformę Entity Framework. Drugi wiersz kodu zapisuje wszelkie 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 filmowego. Druga akcja Edit() próbuje zaktualizować bazę danych.

Lista 4 — Controllers\HomeController.cs (Metody edycji)

public ActionResult Edit(int id)
{
    // Get movie to update
    var movieToUpdate = _db.MovieSet.First(m => m.Id == id);

    ViewData.Model = movieToUpdate;
    return View();
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(FormCollection form)
{
    // Get movie to update
    var id = Int32.Parse(form["id"]);
    var movieToUpdate = _db.MovieSet.First(m => m.Id == id);

    // Deserialize (Include white list!)
    TryUpdateModel(movieToUpdate, new string[] { "Title", "Director" }, form.ToValueProvider());

    // Validate
    if (String.IsNullOrEmpty(movieToUpdate.Title))
        ModelState.AddModelError("Title", "Title is required!");
    if (String.IsNullOrEmpty(movieToUpdate.Director))
        ModelState.AddModelError("Director", "Director is required!");

    // If valid, save movie to database
    if (ModelState.IsValid)
    {
        _db.SaveChanges();
        return RedirectToAction("Index");
    }

    // Otherwise, reshow form
    return View(movieToUpdate);
}

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

var movieToUpdate = _db.MovieSet.First(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 jest dostarczana lista bezpiecznych, aby określić dokładne właściwości do zaktualizowania.

Następnie wykonano prostą walidację, aby sprawdzić, czy właściwości Tytuł filmu i Reżyser mają wartości. Jeśli brakuje żadnej z właściwości, zostanie dodany komunikat o błędzie weryfikacji do parametru 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, która wykonuje aktualizację bazy danych. W przeciwnym razie akcja kontrolera nie będzie wiedzieć, który rekord ma być aktualizowany w bazowej bazie danych. Widok Edytuj zawarty w liście 5 zawiera ukryte pole formularza, które reprezentuje identyfikator edytowanego rekordu bazy danych.

Lista 5 — Views\Home\Edit.aspx

<%@ Page Language="C#" 
  Inherits="System.Web.Mvc.ViewPage<MovieEntityApp.Models.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>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 pozycji Lista 6, aby usunąć określony rekord bazy danych.

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

public ActionResult Delete(int id)
{
    // Get movie to delete
    var movieToDelete = _db.MovieSet.First(m => m.Id == id);

    // Delete 
    _db.DeleteObject(movieToDelete);
    _db.SaveChanges();

    // Show Index view
    return RedirectToAction("Index");
}

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 zostanie przekierowany z powrotem do widoku indeksu.

Podsumowanie

Celem tego samouczka było pokazanie, jak tworzyć oparte na bazie danych aplikacje internetowe, korzystając z 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.

Po pierwsze omówiliśmy sposób generowania modelu danych jednostki za pomocą Kreatora modelu danych jednostek w programie 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.