Samouczek: rozpoczynanie pracy z programem Entity Framework 6 Code First przy użyciu wzorca MVC 5
Uwaga
W przypadku nowego programowania zalecamy ASP.NET Core Razor Pages za pośrednictwem kontrolerów i widoków MVC ASP.NET. Aby zapoznać się z serią samouczków podobną do tej z użyciem platformy Razor Pages, zobacz Samouczek: rozpoczynanie pracy ze stronami Razor w usłudze ASP.NET Core. Nowy samouczek:
- Jest łatwiejsze do naśladowania.
- Zapewnia więcej najlepszych rozwiązań dotyczących platformy EF Core.
- Używa bardziej wydajnych zapytań.
- Jest bardziej aktualny przy użyciu najnowszego interfejsu API.
- Obejmuje więcej funkcji.
- Jest preferowanym podejściem do tworzenia nowych aplikacji.
Z tej serii samouczków dowiesz się, jak utworzyć aplikację ASP.NET MVC 5 korzystającą z programu Entity Framework 6 na potrzeby dostępu do danych. W tym samouczku jest używany przepływ pracy Code First. Aby uzyskać informacje na temat wybierania między elementami Code First, Database First i Model First, zobacz Create a model (Tworzenie modelu).
W tej serii samouczków wyjaśniono, jak utworzyć przykładową aplikację Contoso University. Przykładowa aplikacja to prosta witryna internetowa uniwersytetu. Dzięki niej możesz wyświetlać i aktualizować informacje o uczniach, kursach i instruktorach. Poniżej przedstawiono dwa utworzone ekrany:
W tym samouczku zostały wykonane następujące czynności:
- Tworzenie aplikacji internetowej MVC
- Konfigurowanie stylu witryny
- Instalowanie programu Entity Framework 6
- Tworzenie modelu danych
- Tworzenie kontekstu bazy danych
- Inicjowanie bazy danych przy użyciu danych testowych
- Konfigurowanie programu EF 6 do korzystania z bazy danych LocalDB
- Tworzenie kontrolera i widoków
- Wyświetlanie bazy danych
Wymagania wstępne
Tworzenie aplikacji internetowej MVC
Otwórz program Visual Studio i utwórz projekt internetowy w języku C# przy użyciu szablonu ASP.NET Web Application (.NET Framework). Nadaj projektowi nazwę ContosoUniversity i wybierz przycisk OK.
W obszarze Nowa aplikacja internetowa ASP.NET — ContosoUniversity wybierz pozycję MVC.
Uwaga
Domyślnie opcja Uwierzytelnianie jest ustawiona na wartość Brak uwierzytelniania. W tym samouczku aplikacja internetowa nie wymaga od użytkowników logowania. Ponadto nie ogranicza dostępu na podstawie tego, kto się zalogował.
Wybierz przycisk OK, aby utworzyć projekt.
Konfigurowanie stylu witryny
Kilka prostych zmian spowoduje skonfigurowanie menu witryny, układu i strony głównej.
Otwórz plik Views\Shared\_Layout.cshtml i wprowadź następujące zmiany:
- Zmień każde wystąpienie "Moja aplikacja ASP.NET" i "Nazwa aplikacji" na "Contoso University".
- Dodaj wpisy menu dla uczniów, kursów, instruktorów i działów oraz usuń wpis Kontakt.
Zmiany zostały wyróżnione w następującym fragmencie kodu:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>@ViewBag.Title - Contoso University</title> @Styles.Render("~/Content/css") @Scripts.Render("~/bundles/modernizr") </head> <body> <div class="navbar navbar-inverse navbar-fixed-top"> <div class="navbar-inner"> <div class="container"> <button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> @Html.ActionLink("Contoso University", "Index", "Home", new { area = "" }, new { @class = "navbar-brand" }) <div class="nav-collapse collapse"> <ul class="nav"> <li>@Html.ActionLink("Home", "Index", "Home")</li> <li>@Html.ActionLink("About", "About", "Home")</li> <li>@Html.ActionLink("Students", "Index", "Student")</li> <li>@Html.ActionLink("Courses", "Index", "Course")</li> <li>@Html.ActionLink("Instructors", "Index", "Instructor")</li> <li>@Html.ActionLink("Departments", "Index", "Department")</li> </ul> </div> </div> </div> </div> <div class="container"> @RenderBody() <hr /> <footer> <p>© @DateTime.Now.Year - Contoso University</p> </footer> </div> @Scripts.Render("~/bundles/jquery") @Scripts.Render("~/bundles/bootstrap") @RenderSection("scripts", required: false) </body> </html>
W pliku Views\Home\Index.cshtml zastąp zawartość pliku następującym kodem, aby zastąpić tekst ASP.NET i MVC tekstem o tej aplikacji:
@{ ViewBag.Title = "Home Page"; } <div class="jumbotron"> <h1>Contoso University</h1> </div> <div class="row"> <div class="col-md-4"> <h2>Welcome to Contoso University</h2> <p>Contoso University is a sample application that demonstrates how to use Entity Framework 6 in an ASP.NET MVC 5 web application.</p> </div> <div class="col-md-4"> <h2>Build it from scratch</h2> <p>You can build the application by following the steps in the tutorial series on the ASP.NET site.</p> <p><a class="btn btn-default" href="http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/">See the tutorial »</a></p> </div> <div class="col-md-4"> <h2>Download it</h2> <p>You can download the completed project.</p> <p><a class="btn btn-default" href="https://webpifeed.blob.core.windows.net/webpifeed/Partners/ASP.NET%20MVC%20Application%20Using%20Entity%20Framework%20Code%20First.zip">Download »</a></p> </div> </div>
Naciśnij Ctrl+F5, aby uruchomić witrynę internetową. Zostanie wyświetlona strona główna z menu głównym.
Instalowanie programu Entity Framework 6
W menu Narzędzia wybierz pozycję NuGet Menedżer pakietów, a następnie wybierz pozycję Menedżer pakietów Konsola.
W oknie Menedżer pakietów Console (Konsola Menedżer pakietów) wprowadź następujące polecenie:
Install-Package EntityFramework
Ten krok jest jednym z kilku kroków wykonywanych ręcznie w tym samouczku, ale można to zrobić automatycznie za pomocą funkcji tworzenia szkieletu ASP.NET MVC. Wykonujesz je ręcznie, aby zobaczyć kroki wymagane do korzystania z programu Entity Framework (EF). Później użyjesz szkieletu, aby utworzyć kontroler MVC i widoki. Alternatywą jest automatyczne zainstalowanie pakietu NUGet EF, utworzenie klasy kontekstu bazy danych i utworzenie parametry połączenia. Gdy wszystko będzie gotowe do wykonania w ten sposób, wystarczy pominąć te kroki i utworzyć szkielet kontrolera MVC po utworzeniu klas jednostek.
Tworzenie modelu danych
Następnie utworzysz klasy jednostek dla aplikacji Contoso University. Zaczniesz od następujących trzech jednostek:
Course-Enrollment-Student<><>
Jednostki | Relacja |
---|---|
Kurs na rejestrację | Jeden-do-wielu |
Rejestracja uczniów | Jeden-do-wielu |
Istnieje relacja jeden do wielu między jednostkami Student
i Enrollment
, a istnieje relacja jeden do wielu między jednostkami Course
i Enrollment
. Innymi słowy, student może być zarejestrowany w dowolnej liczbie kursów, a kurs może mieć dowolną liczbę uczniów zarejestrowanych w nim.
W poniższych sekcjach utworzysz klasę dla każdej z tych jednostek.
Uwaga
Jeśli spróbujesz skompilować projekt przed zakończeniem tworzenia wszystkich tych klas jednostek, zostaną wyświetlone błędy kompilatora.
Jednostka Student
W folderze Models utwórz plik klasy o nazwie Student.cs, klikając prawym przyciskiem myszy folder w Eksplorator rozwiązań i wybierając polecenie Dodaj>klasę. Zastąp kod szablonu następującym kodem:
using System; using System.Collections.Generic; namespace ContosoUniversity.Models { public class Student { public int ID { get; set; } public string LastName { get; set; } public string FirstMidName { get; set; } public DateTime EnrollmentDate { get; set; } public virtual ICollection<Enrollment> Enrollments { get; set; } } }
Właściwość ID
stanie się kolumną klucza podstawowego tabeli bazy danych, która odpowiada tej klasie. Domyślnie platforma Entity Framework interpretuje właściwość o nazwie ID
lub nazwie classname ID
jako klucz podstawowy.
Właściwość Enrollments
jest właściwością nawigacji. Właściwości nawigacji przechowują inne jednostki powiązane z tą jednostką. W takim przypadku Enrollments
właściwość Student
jednostki będzie przechowywać wszystkie Enrollment
jednostki powiązane z tą Student
jednostką. Innymi słowy, jeśli dany Student
wiersz w bazie danych zawiera dwa powiązane Enrollment
wiersze (wiersze zawierające podstawową wartość klucza ucznia w kolumnie StudentID
klucza obcego), Student
właściwość nawigacji tej jednostki Enrollments
będzie zawierać te dwie Enrollment
jednostki.
Właściwości nawigacji są zwykle definiowane jako virtual
tak, aby mogły korzystać z niektórych funkcji programu Entity Framework, takich jak ładowanie leniwe. (Ładowanie z opóźnieniem zostanie wyjaśnione później, w Samouczek dotyczący powiązanych danych w dalszej części tej serii).
Jeśli właściwość nawigacji może zawierać wiele jednostek (jak w relacjach wiele do wielu lub jeden do wielu), jej typ musi być listą, w której można dodawać, usuwać i aktualizować wpisy, takie jak ICollection
.
Jednostka Rejestracja
W folderze Models utwórz Enrollment.cs i zastąp istniejący kod następującym kodem:
namespace ContosoUniversity.Models { public enum Grade { A, B, C, D, F } public class Enrollment { public int EnrollmentID { get; set; } public int CourseID { get; set; } public int StudentID { get; set; } public Grade? Grade { get; set; } public virtual Course Course { get; set; } public virtual Student Student { get; set; } } }
Właściwość będzie kluczem podstawowym. Ta jednostka używa wzorca classname ID
zamiast ID
samego siebie, jak pokazano w jednostceStudent
.EnrollmentID
Zazwyczaj należy wybrać jeden wzorzec i używać go w całym modelu danych. W tym miejscu odmiana ilustruje, że można użyć dowolnego wzorca. W późniejszym samouczku zobaczysz, jak używać metody ID
bez classname
ułatwiania implementowania dziedziczenia w modelu danych.
Właściwość Grade
jest wyliczeniową. Znak zapytania po Grade
deklaracji typu wskazuje, że Grade
właściwość jest dopuszczana do wartości null. Klasa o wartości null różni się od klasy zerowej — wartość null oznacza, że ocena nie jest znana lub nie została jeszcze przypisana.
Właściwość StudentID
jest kluczem obcym, a odpowiadająca mu właściwość nawigacji to Student
. Jednostka Enrollment
jest skojarzona z jedną Student
jednostką, więc właściwość może przechowywać tylko jedną Student
jednostkę (w przeciwieństwie do Student.Enrollments
właściwości nawigacji, która może zawierać wiele Enrollment
jednostek).
Właściwość CourseID
jest kluczem obcym, a odpowiadająca mu właściwość nawigacji to Course
. Jednostka Enrollment
jest skojarzona z jedną jednostką Course
.
Program Entity Framework interpretuje właściwość jako właściwość klucza obcego, jeśli ma nazwę właściwości nawigacji nazwa><właściwości klucza podstawowego (na przykład dla Student
właściwości nawigacji, StudentID
ponieważ Student
klucz podstawowy> jednostki to ID
).< Właściwości klucza obcego mogą być również nazwane tą samą po prostu <nazwą> właściwości klucza podstawowego (na przykład ponieważ CourseID
Course
klucz podstawowy jednostki to CourseID
).
Jednostka Course
W folderze Models utwórz Course.cs, zastępując kod szablonu następującym kodem:
using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; namespace ContosoUniversity.Models { public class Course { [DatabaseGenerated(DatabaseGeneratedOption.None)] public int CourseID { get; set; } public string Title { get; set; } public int Credits { get; set; } public virtual ICollection<Enrollment> Enrollments { get; set; } } }
Właściwość Enrollments
jest właściwością nawigacji. Jednostka Course
może być powiązana z dowolną Enrollment
liczbą jednostek.
Więcej informacji na temat atrybutu DatabaseGeneratedAttribute znajdziesz w dalszej części tego samouczka w tej serii. Zasadniczo ten atrybut umożliwia wprowadzenie klucza podstawowego dla kursu zamiast generowania bazy danych.
Tworzenie kontekstu bazy danych
Główną klasą, która koordynuje funkcje programu Entity Framework dla danego modelu danych, jest klasa kontekstu bazy danych. Ta klasa jest tworzona przez wyprowadzenie z klasy System.Data.Entity.DbContext . W kodzie określasz, które jednostki są uwzględnione w modelu danych. Można również dostosować pewne zachowanie platformy Entity Framework. W tym projekcie klasa nosi nazwę SchoolContext
.
Aby utworzyć folder w projekcie ContosoUniversity, kliknij prawym przyciskiem myszy projekt w Eksplorator rozwiązań i kliknij polecenie Dodaj, a następnie kliknij polecenie Nowy folder. Nazwij nowy folder DAL (dla warstwy dostępu do danych). W tym folderze utwórz nowy plik klasy o nazwie SchoolContext.cs i zastąp kod szablonu następującym kodem:
using ContosoUniversity.Models; using System.Data.Entity; using System.Data.Entity.ModelConfiguration.Conventions; namespace ContosoUniversity.DAL { public class SchoolContext : DbContext { public SchoolContext() : base("SchoolContext") { } public DbSet<Student> Students { get; set; } public DbSet<Enrollment> Enrollments { get; set; } public DbSet<Course> Courses { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); } } }
Określanie zestawów jednostek
Ten kod tworzy właściwość DbSet dla każdego zestawu jednostek. W terminologii platformy Entity Framework zestaw jednostek zwykle odpowiada tabeli bazy danych, a jednostka odpowiada wierszowi w tabeli.
Uwaga
Można pominąć instrukcje DbSet<Enrollment>
i DbSet<Course>
i działałoby to samo. Program Entity Framework uwzględnia je niejawnie, ponieważ Student
jednostka odwołuje się do Enrollment
jednostki i Enrollment
odwołuje się do Course
jednostki.
Określanie parametry połączenia
Nazwa parametry połączenia (którą dodasz do pliku Web.config później) jest przekazywana do konstruktora.
public SchoolContext() : base("SchoolContext")
{
}
Można również przekazać sam parametry połączenia zamiast nazwy, która jest przechowywana w pliku Web.config. Aby uzyskać więcej informacji na temat opcji określania bazy danych do użycia, zobacz Parametry połączenia i modele.
Jeśli nie określisz parametry połączenia ani nazwy jednej jawnie, program Entity Framework zakłada, że nazwa parametry połączenia jest taka sama jak nazwa klasy. Domyślna nazwa parametry połączenia w tym przykładzie będzie taka SchoolContext
sama jak określona jawnie.
Określanie pojedynczych nazw tabel
Instrukcja modelBuilder.Conventions.Remove
w metodzie OnModelCreating uniemożliwia tworzenie nazw tabel w liczbie mnogiej. Jeśli tego nie zrobisz, wygenerowane tabele w bazie danych będą miały nazwę Students
, Courses
i Enrollments
. Zamiast tego nazwy tabel to Student
, Course
i Enrollment
. Deweloperzy nie zgadzają się, czy nazwy tabel powinny być w liczbie mnogiej, czy nie. W tym samouczku użyto pojedynczego formularza, ale ważnym punktem jest wybranie niezależnie od preferowanego formularza przez dołączenie lub pominięcie tego wiersza kodu.
Inicjowanie bazy danych przy użyciu danych testowych
Program Entity Framework może automatycznie utworzyć (lub usunąć i ponownie utworzyć) bazę danych po uruchomieniu aplikacji. Można określić, że powinno to być wykonywane za każdym razem, gdy aplikacja działa lub tylko wtedy, gdy model nie jest zsynchronizowany z istniejącą bazą danych. Możesz również napisać metodę Seed
, którą program Entity Framework automatycznie wywołuje po utworzeniu bazy danych, aby wypełnić ją danymi testowymi.
Domyślnym zachowaniem jest utworzenie bazy danych tylko wtedy, gdy nie istnieje (i zgłoszenie wyjątku, jeśli model uległ zmianie, a baza danych już istnieje). W tej sekcji określisz, że baza danych powinna zostać porzucona i ponownie utworzona za każdym razem, gdy model ulegnie zmianie. Usunięcie bazy danych powoduje utratę wszystkich danych. Zwykle jest to w porządku podczas programowania, ponieważ Seed
metoda zostanie uruchomiona po ponownym utworzeniu bazy danych i ponownie utworzy dane testowe. Jednak w środowisku produkcyjnym zwykle nie chcesz tracić wszystkich danych za każdym razem, gdy trzeba zmienić schemat bazy danych. Później zobaczysz, jak obsługiwać zmiany modelu przy użyciu Migracje Code First, aby zmienić schemat bazy danych zamiast usuwać i ponownie tworzyć bazę danych.
W folderze DAL utwórz nowy plik klasy o nazwie SchoolInitializer.cs i zastąp kod szablonu następującym kodem, co powoduje utworzenie bazy danych w razie potrzeby i załadowanie danych testowych do nowej bazy danych.
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Data.Entity; using ContosoUniversity.Models; namespace ContosoUniversity.DAL { public class SchoolInitializer : System.Data.Entity. DropCreateDatabaseIfModelChanges<SchoolContext> { protected override void Seed(SchoolContext context) { var students = new List<Student> { new Student{FirstMidName="Carson",LastName="Alexander",EnrollmentDate=DateTime.Parse("2005-09-01")}, new Student{FirstMidName="Meredith",LastName="Alonso",EnrollmentDate=DateTime.Parse("2002-09-01")}, new Student{FirstMidName="Arturo",LastName="Anand",EnrollmentDate=DateTime.Parse("2003-09-01")}, new Student{FirstMidName="Gytis",LastName="Barzdukas",EnrollmentDate=DateTime.Parse("2002-09-01")}, new Student{FirstMidName="Yan",LastName="Li",EnrollmentDate=DateTime.Parse("2002-09-01")}, new Student{FirstMidName="Peggy",LastName="Justice",EnrollmentDate=DateTime.Parse("2001-09-01")}, new Student{FirstMidName="Laura",LastName="Norman",EnrollmentDate=DateTime.Parse("2003-09-01")}, new Student{FirstMidName="Nino",LastName="Olivetto",EnrollmentDate=DateTime.Parse("2005-09-01")} }; students.ForEach(s => context.Students.Add(s)); context.SaveChanges(); var courses = new List<Course> { new Course{CourseID=1050,Title="Chemistry",Credits=3,}, new Course{CourseID=4022,Title="Microeconomics",Credits=3,}, new Course{CourseID=4041,Title="Macroeconomics",Credits=3,}, new Course{CourseID=1045,Title="Calculus",Credits=4,}, new Course{CourseID=3141,Title="Trigonometry",Credits=4,}, new Course{CourseID=2021,Title="Composition",Credits=3,}, new Course{CourseID=2042,Title="Literature",Credits=4,} }; courses.ForEach(s => context.Courses.Add(s)); context.SaveChanges(); var enrollments = new List<Enrollment> { new Enrollment{StudentID=1,CourseID=1050,Grade=Grade.A}, new Enrollment{StudentID=1,CourseID=4022,Grade=Grade.C}, new Enrollment{StudentID=1,CourseID=4041,Grade=Grade.B}, new Enrollment{StudentID=2,CourseID=1045,Grade=Grade.B}, new Enrollment{StudentID=2,CourseID=3141,Grade=Grade.F}, new Enrollment{StudentID=2,CourseID=2021,Grade=Grade.F}, new Enrollment{StudentID=3,CourseID=1050}, new Enrollment{StudentID=4,CourseID=1050,}, new Enrollment{StudentID=4,CourseID=4022,Grade=Grade.F}, new Enrollment{StudentID=5,CourseID=4041,Grade=Grade.C}, new Enrollment{StudentID=6,CourseID=1045}, new Enrollment{StudentID=7,CourseID=3141,Grade=Grade.A}, }; enrollments.ForEach(s => context.Enrollments.Add(s)); context.SaveChanges(); } } }
Metoda
Seed
przyjmuje obiekt kontekstu bazy danych jako parametr wejściowy, a kod w metodzie używa tego obiektu do dodawania nowych jednostek do bazy danych. Dla każdego typu jednostki kod tworzy kolekcję nowych jednostek, dodaje je do odpowiedniejDbSet
właściwości, a następnie zapisuje zmiany w bazie danych. Nie jest konieczne wywołanieSaveChanges
metody po każdej grupie jednostek, jak pokazano w tym miejscu, ale pomaga zlokalizować źródło problemu, jeśli wystąpi wyjątek podczas zapisywania kodu w bazie danych.Aby poinformować program Entity Framework o użyciu klasy inicjatora, dodaj element do
entityFramework
elementu w pliku web.config aplikacji (ten w głównym folderze projektu), jak pokazano w poniższym przykładzie:<entityFramework> <contexts> <context type="ContosoUniversity.DAL.SchoolContext, ContosoUniversity"> <databaseInitializer type="ContosoUniversity.DAL.SchoolInitializer, ContosoUniversity" /> </context> </contexts> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> <parameters> <parameter value="v11.0" /> </parameters> </defaultConnectionFactory> <providers> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> </providers> </entityFramework>
Określa
context type
w pełni kwalifikowaną nazwę klasy kontekstu i zestaw, w nim znajduje się, orazdatabaseinitializer type
określa w pełni kwalifikowaną nazwę klasy inicjatora i zestawu, w nim znajduje się. (Jeśli nie chcesz, aby program EF używał inicjatora, możesz ustawić atrybut na elemeciecontext
:disableDatabaseInitialization="true"
.) Aby uzyskać więcej informacji, zobacz Configuration File Settings (Ustawienia pliku konfiguracji).Alternatywą dla ustawienia inicjatora w pliku Web.config jest wykonywanie go w kodzie przez dodanie
Database.SetInitializer
instrukcji doApplication_Start
metody w pliku Global.asax.cs. Aby uzyskać więcej informacji, zobacz Understanding Database Initializers in Entity Framework Code First (Opis inicjatorów bazy danych w programie Entity Framework Code First).
Aplikacja jest teraz skonfigurowana tak, aby podczas uzyskiwania dostępu do bazy danych po raz pierwszy w danym uruchomieniu aplikacji program Entity Framework porównał bazę danych z modelem ( SchoolContext
klasami jednostek i ). Jeśli wystąpi różnica, aplikacja spadnie i ponownie utworzy bazę danych.
Uwaga
Podczas wdrażania aplikacji na produkcyjnym serwerze internetowym należy usunąć lub wyłączyć kod, który usuwa i ponownie tworzy bazę danych. Zrobisz to w późniejszym samouczku w tej serii.
Konfigurowanie programu EF 6 do korzystania z bazy danych LocalDB
LocalDB to uproszczona wersja aparatu bazy danych SQL Server Express. Instalowanie i konfigurowanie, uruchamianie na żądanie i uruchamianie w trybie użytkownika jest łatwe. Baza danych LocalDB działa w specjalnym trybie wykonywania programu SQL Server Express, który umożliwia pracę z bazami danych jako pliki .mdf . Możesz umieścić pliki bazy danych LocalDB w folderze App_Data projektu internetowego, jeśli chcesz mieć możliwość skopiowania bazy danych z projektem. Funkcja wystąpienia użytkownika w programie SQL Server Express umożliwia również pracę z plikami .mdf , ale funkcja wystąpienia użytkownika jest przestarzała, dlatego usługa LocalDB jest zalecana do pracy z plikami .mdf . Baza danych LocalDB jest instalowana domyślnie w programie Visual Studio.
Zazwyczaj program SQL Server Express nie jest używany w przypadku produkcyjnych aplikacji internetowych. W szczególności baza danych LocalDB nie jest zalecana do użytku produkcyjnego z aplikacją internetową, ponieważ nie jest przeznaczona do pracy z usługami IIS.
W tym samouczku będziesz pracować z bazą danych LocalDB. Otwórz plik Web.config aplikacji i dodaj
connectionStrings
element poprzedzającyappSettings
element, jak pokazano w poniższym przykładzie. (Upewnij się, że zaktualizowano Plik Web.config w głównym folderze projektu. W podfolderze Views nie trzeba aktualizować pliku Web.config.<connectionStrings> <add name="SchoolContext" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;Initial Catalog=ContosoUniversity1;Integrated Security=SSPI;" providerName="System.Data.SqlClient"/> </connectionStrings> <appSettings> <add key="webpages:Version" value="3.0.0.0" /> <add key="webpages:Enabled" value="false" /> <add key="ClientValidationEnabled" value="true" /> <add key="UnobtrusiveJavaScriptEnabled" value="true" /> </appSettings>
Dodany parametry połączenia określa, że program Entity Framework będzie używać bazy danych LocalDB o nazwie ContosoUniversity1.mdf. (Baza danych nie istnieje jeszcze, ale program EF go utworzy). Jeśli chcesz utworzyć bazę danych w folderze App_Data, możesz dodać AttachDBFilename=|DataDirectory|\ContosoUniversity1.mdf
do parametry połączenia. Aby uzyskać więcej informacji na temat parametry połączenia, zobacz Parametry połączenia programu SQL Server dla aplikacji internetowych ASP.NET.
Nie potrzebujesz parametry połączenia w pliku Web.config. Jeśli nie podasz parametry połączenia, program Entity Framework używa domyślnego parametry połączenia na podstawie klasy kontekstu. Aby uzyskać więcej informacji, zobacz Code First to a New Database (Kod pierwszy do nowej bazy danych).
Tworzenie kontrolera i widoków
Teraz utworzysz stronę internetową do wyświetlania danych. Proces żądania danych automatycznie wyzwala tworzenie bazy danych. Zaczniesz od utworzenia nowego kontrolera. Jednak zanim to zrobisz, skompiluj projekt, aby udostępnić klasy modelu i kontekstu szkieletowi kontrolera MVC.
Kliknij prawym przyciskiem myszy folder Controllers w Eksplorator rozwiązań, wybierz pozycję Dodaj, a następnie kliknij pozycję Nowy element szkieletowy.
W oknie dialogowym Dodawanie szkieletu wybierz pozycję Kontroler MVC 5 z widokami przy użyciu programu Entity Framework, a następnie wybierz pozycję Dodaj.
W oknie dialogowym Dodawanie kontrolera wybierz następujące opcje, a następnie wybierz pozycję Dodaj:
Klasa modelu: Student (ContosoUniversity.Models). (Jeśli ta opcja nie jest widoczna na liście rozwijanej, skompiluj projekt i spróbuj ponownie).
Klasa kontekstu danych: SchoolContext (ContosoUniversity.DAL).
Nazwa kontrolera: StudentController (nie StudentsController ).
Pozostaw wartości domyślne dla innych pól.
Po kliknięciu przycisku Dodaj szkielet tworzy plik StudentController.cs i zestaw widoków (pliki cshtml), które współpracują z kontrolerem. W przyszłości podczas tworzenia projektów korzystających z programu Entity Framework możesz również skorzystać z pewnych dodatkowych funkcji szkieletu: utwórz pierwszą klasę modelu, nie twórz parametry połączenia, a następnie w polu Dodaj kontroler określ nowy kontekst danych, wybierając + przycisk obok pozycji Klasa kontekstu danych. Szkielet utworzy
DbContext
klasę i parametry połączenia, a także kontroler i widoki.
Program Visual Studio otwiera plik Controllers\StudentController.cs . Zobaczysz, że utworzono zmienną klasy, która tworzy wystąpienie obiektu kontekstu bazy danych:
private SchoolContext db = new SchoolContext();
Metoda
Index
akcji pobiera listę uczniów z zestawu jednostek Students , odczytującStudents
właściwość wystąpienia kontekstu bazy danych:public ViewResult Index() { return View(db.Students.ToList()); }
Widok Student\Index.cshtml wyświetla tę listę w tabeli:
<table> <tr> <th> @Html.DisplayNameFor(model => model.LastName) </th> <th> @Html.DisplayNameFor(model => model.FirstMidName) </th> <th> @Html.DisplayNameFor(model => model.EnrollmentDate) </th> <th></th> </tr> @foreach (var item in Model) { <tr> <td> @Html.DisplayFor(modelItem => item.LastName) </td> <td> @Html.DisplayFor(modelItem => item.FirstMidName) </td> <td> @Html.DisplayFor(modelItem => item.EnrollmentDate) </td> <td> @Html.ActionLink("Edit", "Edit", new { id=item.ID }) | @Html.ActionLink("Details", "Details", new { id=item.ID }) | @Html.ActionLink("Delete", "Delete", new { id=item.ID }) </td> </tr> }
Naciśnij Ctrl+F5, aby uruchomić projekt. (Jeśli wystąpi błąd "Nie można utworzyć kopii w tle", zamknij przeglądarkę i spróbuj ponownie).
Kliknij kartę Uczniowie, aby wyświetlić dane testowe wstawione przez metodę
Seed
. W zależności od tego, jak wąskie jest okno przeglądarki, na górnym pasku adresu pojawi się link karta Student lub musisz kliknąć prawy górny róg, aby wyświetlić link.
Wyświetlanie bazy danych
Po uruchomieniu strony Uczniowie i aplikacja próbowała uzyskać dostęp do bazy danych, program EF odkrył, że nie ma żadnej bazy danych i utworzył ją. Następnie program EF uruchomił metodę inicja, aby wypełnić bazę danych danymi.
Aby wyświetlić bazę danych w programie Visual Studio, możesz użyć Eksploratora serwera lub programu SQL Server Eksplorator obiektów (SSOX). Na potrzeby tego samouczka użyjesz Eksploratora serwera.
Zamknij okno przeglądarki.
W Eksploratorze serwera rozwiń węzeł Połączenia danych (może być konieczne najpierw wybranie przycisku odświeżania), rozwiń węzeł Kontekst szkoły (ContosoUniversity), a następnie rozwiń węzeł Tabele, aby wyświetlić tabele w nowej bazie danych.
Kliknij prawym przyciskiem myszy tabelę Student i kliknij pozycję Pokaż dane tabeli, aby wyświetlić utworzone kolumny i wiersze wstawione do tabeli.
Zamknij połączenie Eksploratora serwera.
Pliki bazy danych ContosoUniversity1.mdf i ldf znajdują się w folderze %USERPROFILE%.
Ponieważ używasz inicjatora DropCreateDatabaseIfModelChanges
, możesz teraz wprowadzić zmianę w Student
klasie, ponownie uruchomić aplikację, a baza danych zostanie automatycznie utworzona ponownie, aby dopasować ją do zmiany. Jeśli na przykład dodasz EmailAddress
właściwość do Student
klasy, uruchom ponownie stronę Uczniowie, a następnie ponownie przyjrzysz się tabeli, zobaczysz nową EmailAddress
kolumnę.
Konwencje
Ilość kodu, który trzeba było napisać, aby program Entity Framework mógł utworzyć pełną bazę danych, jest minimalny ze względu na konwencje lub założenia, które tworzy platforma Entity Framework. Niektóre z nich zostały już zauważone lub zostały użyte bez świadomości o nich:
- Nazwy klas jednostek są używane jako nazwy tabel w liczbie mnogiej.
- Nazwy właściwości jednostki są używane dla nazw kolumn.
- Właściwości jednostki o nazwie
ID
lub klasieID
są rozpoznawane jako właściwości klucza podstawowego. - Właściwość jest interpretowana jako właściwość klucza obcego, jeśli nosi nazwę właściwości nawigacji nazwa><właściwości klucza podstawowego (na przykład dla
Student
właściwości nawigacji,StudentID
ponieważStudent
klucz podstawowy> jednostki toID
).< Właściwości klucza obcego mogą być również nazwane tą samą po prostu <nazwą> właściwości klucza podstawowego (na przykład ponieważEnrollmentID
Enrollment
klucz podstawowy jednostki toEnrollmentID
).
Wiesz już, że konwencje można zastąpić. Na przykład określono, że nazwy tabel nie powinny być w liczbie mnogiej, a później zobaczysz, jak jawnie oznaczyć właściwość jako właściwość klucza obcego.
Uzyskiwanie kodu
Pobieranie ukończonego projektu
Dodatkowe zasoby
Aby uzyskać więcej informacji na temat platformy EF 6, zobacz następujące artykuły:
Następne kroki
W tym samouczku zostały wykonane następujące czynności:
- Tworzenie aplikacji internetowej MVC
- Konfigurowanie stylu witryny
- Zainstalowano program Entity Framework 6
- Tworzenie modelu danych
- Utworzono kontekst bazy danych
- Zainicjowana baza danych z danymi testowymi
- Konfigurowanie programu EF 6 do korzystania z bazy danych LocalDB
- Utworzony kontroler i widoki
- Wyświetlanie bazy danych
Przejdź do następnego artykułu, aby dowiedzieć się, jak przeglądać i dostosowywać kod tworzenia, odczytywania, aktualizowania, usuwania (CRUD) w kontrolerach i widokach.