Lernprogramm: Erste Schritte mit Entity Framework 6 Code mit MVC 5
Hinweis
Für eine neue Entwicklung empfehlen wir ASP.NET Core Razor Pages über ASP.NET MVC-Controller und -Ansichten. Eine Lernprogrammreihe, die mit Razor Pages vergleichbar ist, finden Sie unter Tutorial: Erste Schritte mit Razor Pages in ASP.NET Core. Das neue Lernprogramm:
- Ist einfacher zu befolgen.
- Bietet mehr bewährte Methoden für Entity Framework Core.
- Verwendet effizientere Abfragen.
- Passt besser zur aktuellen API.
- Behandelt mehr Features.
- Ist die bevorzugte Methode für die Entwicklung neuer Anwendungen.
In dieser Reihe von Lernprogrammen erfahren Sie, wie Sie eine ASP.NET MVC 5-Anwendung erstellen, die Entity Framework 6 für den Datenzugriff verwendet. In diesem Lernprogramm wird der Code First-Workflow verwendet. Informationen zum Auswählen zwischen Code First, Database First und Model First finden Sie unter Erstellen eines Modells.
In dieser Lernprogrammreihe wird erläutert, wie Sie die Contoso University-Beispielanwendung erstellen. Die Beispielanwendung ist eine einfache Universitätswebsite. Damit können Sie Informationen zu Kursteilnehmern, Kursen und Kursleitern anzeigen und aktualisieren. Hier sind zwei der von Ihnen erstellten Bildschirme:
In diesem Tutorial:
- Erstellen einer MVC-Web-App
- Einrichten des Websitestils
- Installieren von Entity Framework 6
- Erstellen des Datenmodells
- Erstellen des Datenbankkontexts
- Initialisieren Sie die Datenbank mit Testdaten
- Einrichten von EF 6 für die Verwendung von LocalDB
- Erstellen Sie Controller und Ansichten
- Zeigen Sie die Datenbank an
Voraussetzungen
Erstellen einer MVC-Web-App
Öffnen Sie Visual Studio, und erstellen Sie ein C#-Webprojekt mithilfe der Vorlage ASP.NET Webanwendung (.NET Framework). Benennen Sie das Projekt ContosoUniversity, und wählen Sie "OK" aus.
Wählen Sie in "New ASP.NET Web Application - ContosoUniversity" die Option "MVC" aus.
Hinweis
Standardmäßig ist die Authentifizierungsoption auf "Keine Authentifizierung" festgelegt. Für dieses Lernprogramm muss sich die Web-App nicht anmelden. Außerdem schränkt er den Zugriff nicht auf der Grundlage der angemeldeten Person ein.
Klicken Sie auf OK, um das Projekt zu erstellen.
Einrichten des Websitestils
Sie können das Websitemenü, das Layout und die Startseite über einige Änderungen einrichten.
Öffnen Sie "Views\Shared\_Layout.cshtml", und nehmen Sie die folgenden Änderungen vor:
- Ändern Sie jedes Vorkommen von "My ASP.NET Application" und "Application name" in "Contoso University".
- Fügen Sie Menüeinträge für Kursteilnehmer, Kurse, Kursleiter und Abteilungen hinzu, und löschen Sie den Kontakteintrag.
Die Änderungen werden im folgenden Codeausschnitt hervorgehoben:
<!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>
Ersetzen Sie in Views\Home\Index.cshtml den Inhalt der Datei durch den folgenden Code, um den Text zu ASP.NET und MVC durch Text zu dieser Anwendung zu ersetzen:
@{ 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>
Drücken Sie STRG+F5, um die Website auszuführen. Die Startseite wird mit dem Hauptmenü angezeigt.
Installieren von Entity Framework 6
Wählen Sie im Menü "Extras" die Option "NuGet Paket-Manager" und dann Paket-Manager Konsole aus.
Geben Sie im Fenster Paket-Manager-Konsole den folgenden Befehl ein:
Install-Package EntityFramework
Dieser Schritt ist eine der wenigen Schritte, die in diesem Lernprogramm manuell ausgeführt werden, aber dies könnte von der ASP.NET MVC-Gerüstfunktion automatisch durchgeführt werden. Sie führen sie manuell aus, damit Sie die erforderlichen Schritte für die Verwendung von Entity Framework (EF) sehen können. Sie verwenden das Gerüst später, um den MVC-Controller und die Ansichten zu erstellen. Eine Alternative besteht darin, das Gerüst automatisch zu installieren, das EF NuGet-Paket zu installieren, die Datenbankkontextklasse zu erstellen und die Verbindungszeichenfolge zu erstellen. Wenn Sie damit fertig sind, müssen Sie diese Schritte überspringen und den MVC-Controller gerüsten, nachdem Sie Ihre Entitätsklassen erstellt haben.
Erstellen des Datenmodells
Als nächstes erstellen Sie Entitätsklassen für die Contoso University-Anwendung. Sie beginnen mit den folgenden drei Entitäten:
Kursteilnehmer<<>>
Entitäten | Beziehung |
---|---|
Kurs für Anmeldung | 1:n |
Student to Enrollment | 1:n |
Es besteht eine 1:n-Beziehung zwischen den Entitäten Student
und Enrollment
. Außerdem besteht eine 1:n-Beziehung zwischen den Entitäten Course
und Enrollment
. Das bedeutet, dass ein Student für beliebig viele Kurse angemeldet sein kann und sich für jeden Kurs eine beliebige Anzahl von Studenten anmelden kann.
In den folgenden Abschnitten erstellen Sie eine Klasse für jede dieser Entitäten.
Hinweis
Wenn Sie versuchen, das Projekt zu kompilieren, bevor Sie die Erstellung aller dieser Entitätsklassen abgeschlossen haben, erhalten Sie Compilerfehler.
Die Entität „Student“
Erstellen Sie im Ordner "Modelle" eine Klassendatei namens Student.cs, indem Sie in Projektmappen-Explorer mit der rechten Maustaste auf den Ordner klicken und "Klasse hinzufügen">auswählen. Ersetzen Sie den Vorlagencode durch den folgenden Code:
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; } } }
Die ID
-Eigenschaft fungiert als Primärschlüsselspalte der Datenbanktabelle, die dieser Klasse entspricht. Standardmäßig interpretiert Entity Framework eine Eigenschaft, die den Namen ID
oder den Klassennamen ID
als Primärschlüssel bezeichnet.
Die Enrollments
-Eigenschaft ist eine Navigationseigenschaft. Navigationseigenschaften enthalten andere Entitäten, die dieser Entität zugehörig sind. In diesem Fall enthält die Enrollments
Eigenschaft einer Student
Entität alle Entitäten, die Enrollment
mit dieser Student
Entität zusammenhängen. Anders ausgedrückt: Wenn eine bestimmte Student
Zeile in der Datenbank über zwei verknüpfte Enrollment
Zeilen verfügt (Zeilen, die den Primärschlüsselwert dieses Kursteilnehmers in ihrer StudentID
Fremdschlüsselspalte enthalten), Student
enthält die Navigationseigenschaft Enrollments
dieser Entität diese beiden Enrollment
Entitäten.
Navigationseigenschaften werden in der Regel so virtual
definiert, dass sie bestimmte Entity Framework-Funktionen nutzen können, z . B. das faule Laden. (Lazy Loading wird später im Lernprogramm zum Lesen verwandter Daten weiter unten in dieser Reihe.)
Wenn eine Navigationseigenschaft mehrere Entitäten enthalten kann (wie bei m:n- oder 1:n-Beziehungen), muss dessen Typ aus einer Liste bestehen, in der Einträge hinzugefügt, gelöscht und aktualisiert werden können – z.B.: ICollection
.
Die Entität „Enrollment“
Erstellen Sie im Ordner Models (Modelle) die Datei Enrollment.cs, und ersetzen Sie den vorhandenen Code durch folgenden Code:
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; } } }
Die EnrollmentID
Eigenschaft ist der Primärschlüssel. Diese Entität verwendet das Klassennamenmuster ID
anstelle von ID
sich selbst, wie Sie in der Student
Entität gesehen haben. Normalerweise würden Sie nur ein Muster auswählen und dieses für das gesamte Datenmodell verwenden. Diese Variation soll verdeutlichen, dass Sie ein beliebiges Muster erstellen können. In einem späteren Lernprogramm erfahren Sie, wie Sie die Verwendung ID
ohne classname
die Implementierung der Vererbung im Datenmodell vereinfachen.
Die Grade
Eigenschaft ist eine Enumeration. Das Fragezeichen nach der Grade
-Typdeklaration gibt an, dass die Grade
-Eigenschaft NULL-Werte zulässt. Eine Klasse, die null ist, unterscheidet sich von einer Nullnote – Null bedeutet, dass eine Noten nicht bekannt ist oder noch nicht zugewiesen wurde.
Bei der StudentID
-Eigenschaft handelt es sich um einen Fremdschlüssel, und Student
ist die entsprechende Navigationseigenschaft. Eine Enrollment
-Entität wird einer Student
-Entität zugeordnet, damit die Eigenschaft nur eine Student
-Entität enthalten kann. Dies steht im Gegensatz zu der bereits erläuterten Student.Enrollments
-Navigationseigenschaft, die mehrere Enrollment
-Entitäten enthalten kann.
Bei der CourseID
-Eigenschaft handelt es sich um einen Fremdschlüssel, und die zugehörige Navigationseigenschaft lautet Course
. Die Enrollment
-Entität wird einer Course
-Entität zugeordnet.
Entity Framework interpretiert eine Eigenschaft als Fremdschlüsseleigenschaft, wenn es sich um den Namen <der Primärschlüsseleigenschaftsname>>< der Primärschlüsseleigenschaft handelt (z. B. für die Student
Navigationseigenschaft, StudentID
da der Primärschlüssel der Student
Entität lautetID
). Fremdschlüsseleigenschaften können auch denselben namen, der einfach nur der Primärschlüsseleigenschaftsname> ist (zCourseID
. B. da der Primärschlüssel der Course
Entität istCourseID
).<
Die Entität „Course“
Erstellen Sie im Ordner "Models" Course.cs, und ersetzen Sie den Vorlagencode durch den folgenden Code:
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; } } }
Die Enrollments
-Eigenschaft ist eine Navigationseigenschaft. Course
-Entitäten können sich auf jede beliebige Anzahl von Enrollment
-Entitäten beziehen.
Wir werden mehr über das DatabaseGeneratedAttribute Attribut in einem späteren Lernprogramm in dieser Reihe sagen. Im Grunde können Sie über dieses Attribut den Primärschlüssel für den Kurs angeben, anstatt ihn von der Datenbank generieren zu lassen.
Erstellen des Datenbankkontexts
Die Hauptklasse, die die Entity Framework-Funktionalität für ein bestimmtes Datenmodell koordiniert, ist die Datenbankkontextklasse . Sie erstellen diese Klasse, indem Sie von der System.Data.Entity.DbContext-Klasse abgeleitet werden. In Ihrem Code geben Sie an, welche Entitäten im Datenmodell enthalten sind. Außerdem können Sie bestimmte Entity Framework-Verhalten anpassen. In diesem Projekt heißt die Klasse SchoolContext
.
Um einen Ordner im ContosoUniversity-Projekt zu erstellen, klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und klicken Sie dann auf "Hinzufügen", und klicken Sie dann auf "Neuer Ordner". Benennen Sie den neuen Ordner DAL (für Data Access Layer). Erstellen Sie in diesem Ordner eine neue Klassendatei mit dem Namen SchoolContext.cs, und ersetzen Sie den Vorlagencode durch den folgenden Code:
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>(); } } }
Angeben von Entitätssätzen
Dieser Code erstellt eine DbSet-Eigenschaft für jeden Entitätssatz. In der Terminologie von Entity Framework entspricht ein Entitätssatz in der Regel einer Datenbanktabelle, und eine Entität entspricht einer Zeile in der Tabelle.
Hinweis
Sie können die DbSet<Enrollment>
Anweisungen und DbSet<Course>
Anweisungen weglassen, und es funktionierte genauso. Entity Framework würde sie implizit einschließen, da die Entität auf die Student
Enrollment
Entität und die Enrollment
Entität verweist auf die Course
Entität.
Angeben des Verbindungszeichenfolge
Der Name der Verbindungszeichenfolge (die Sie später zur Web.config-Datei hinzufügen) wird an den Konstruktor übergeben.
public SchoolContext() : base("SchoolContext")
{
}
Sie können auch die Verbindungszeichenfolge selbst anstelle des Namens einer übergeben, die in der Datei "Web.config" gespeichert ist. Weitere Informationen zu Optionen zum Angeben der zu verwendenden Datenbank finden Sie unter Verbindungszeichenfolgen und -modelle.
Wenn Sie keine Verbindungszeichenfolge oder den Namen eines explizit angeben, geht Entity Framework davon aus, dass der Verbindungszeichenfolge Name mit dem Klassennamen identisch ist. Der Standardname Verbindungszeichenfolge in diesem Beispiel wäre dann SchoolContext
identisch mit dem, was Sie explizit angeben.
Angeben von Singulartabellennamen
Die modelBuilder.Conventions.Remove
Anweisung in der OnModelCreating-Methode verhindert, dass Tabellennamen pluralisiert werden. Wenn Sie dies nicht tun, würden die generierten Tabellen in der Datenbank den Namen Students
, Courses
und .Enrollments
Stattdessen sind Student
die Tabellennamen , Course
und Enrollment
. Entwickler sind sich uneinig darüber, ob Tabellennamen im Plural stehen sollten oder nicht. In diesem Lernprogramm wird das Singular-Formular verwendet, aber der wichtige Punkt ist, dass Sie auswählen können, welches Formular Sie bevorzugen, indem Sie diese Codezeile einschließen oder weglassen.
Initialisieren Sie die Datenbank mit Testdaten
Entity Framework kann automatisch eine Datenbank erstellen (oder ablegen und erneut erstellen), wenn die Anwendung ausgeführt wird. Sie können angeben, dass dies bei jeder Ausführung der Anwendung erfolgen soll oder nur, wenn das Modell nicht mit der vorhandenen Datenbank synchronisiert ist. Sie können auch eine Seed
Methode schreiben, die Entity Framework nach dem Erstellen der Datenbank automatisch aufruft, um sie mit Testdaten aufzufüllen.
Das Standardverhalten besteht darin, eine Datenbank nur zu erstellen, wenn sie nicht vorhanden ist (und eine Ausnahme ausgelöst wird, wenn das Modell geändert wurde und die Datenbank bereits vorhanden ist). In diesem Abschnitt geben Sie an, dass die Datenbank gelöscht und neu erstellt werden soll, wenn sich das Modell ändert. Durch das Ablegen der Datenbank wird der Verlust aller Daten verursacht. Dies ist in der Regel in Ordnung während der Entwicklung, da die Seed
Methode beim erneuten Erstellen der Datenbank ausgeführt wird und ihre Testdaten erneut erstellt. In der Produktion möchten Sie jedoch nicht jedes Mal, wenn Sie das Datenbankschema ändern müssen, nicht alle Ihre Daten verlieren. Später erfahren Sie, wie Sie Modelländerungen mithilfe von Code First-Migrationen behandeln, um das Datenbankschema zu ändern, anstatt die Datenbank zu löschen und erneut zu erstellen.
Erstellen Sie im DAL-Ordner eine neue Klassendatei mit dem Namen SchoolInitializer.cs , und ersetzen Sie den Vorlagencode durch den folgenden Code, wodurch bei Bedarf eine Datenbank erstellt und Testdaten in die neue Datenbank geladen werden.
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(); } } }
Die
Seed
Methode verwendet das Datenbankkontextobjekt als Eingabeparameter, und der Code in der Methode verwendet dieses Objekt, um der Datenbank neue Entitäten hinzuzufügen. Für jeden Entitätstyp erstellt der Code eine Auflistung neuer Entitäten, fügt sie der entsprechendenDbSet
Eigenschaft hinzu und speichert dann die Änderungen in der Datenbank. Es ist nicht erforderlich, dieSaveChanges
Methode nach jeder Gruppe von Entitäten aufzurufen, wie hier beschrieben, aber dadurch können Sie die Quelle eines Problems finden, wenn eine Ausnahme auftritt, während der Code in die Datenbank schreibt.Um Entity Framework anzuweisen, ihre Initialisierungsklasse zu verwenden, fügen Sie dem
entityFramework
Element in der Datei "Web.config" der Anwendung ein Element (die im Stammprojektordner) hinzu, wie im folgenden Beispiel gezeigt:<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>
Der
context type
Specifies the fully qualified context class name and the assembly it's in, and thedatabaseinitializer type
specifies the fully qualified name of the initializer class and the assembly it's in. (Wenn EF nicht den Initialisierer verwenden soll, können Sie ein Attribut für dascontext
Element festlegen:disableDatabaseInitialization="true"
.) Weitere Informationen finden Sie unter Konfigurationsdateieinstellungen.Eine Alternative zum Festlegen des Initialisierers in der Datei "Web.config " besteht darin, dies im Code durch Hinzufügen einer
Database.SetInitializer
Anweisung zur Methode in derApplication_Start
Global.asax.cs-Datei auszuführen. Weitere Informationen finden Sie unter Understanding Database Initializers in Entity Framework Code First.
Die Anwendung ist jetzt so eingerichtet, dass Entity Framework beim ersten Zugriff auf die Datenbank in einer bestimmten Ausführung der Anwendung die Datenbank mit dem Modell (Ihre SchoolContext
und Entitätsklassen) vergleicht. Wenn ein Unterschied besteht, fällt die Anwendung ab und erstellt die Datenbank erneut.
Hinweis
Wenn Sie eine Anwendung auf einem Produktionswebserver bereitstellen, müssen Sie Code entfernen oder deaktivieren, der abbricht und die Datenbank erneut erstellt. Sie werden dies in einem späteren Lernprogramm in dieser Reihe tun.
Einrichten von EF 6 für die Verwendung von LocalDB
LocalDB ist eine einfache Version des SQL Server Express-Datenbankmoduls. Es ist einfach zu installieren und zu konfigurieren, startet bei Bedarf und wird im Benutzermodus ausgeführt. LocalDB wird in einem speziellen Ausführungsmodus von SQL Server Express ausgeführt, mit dem Sie mit Datenbanken als .mdf Dateien arbeiten können. Sie können LocalDB-Datenbankdateien im ordner App_Data eines Webprojekts ablegen, wenn Sie die Datenbank mit dem Projekt kopieren möchten. Mit dem Benutzerinstanzfeature in SQL Server Express können Sie auch mit .mdf Dateien arbeiten, das Benutzerinstanzfeature ist jedoch veraltet. Daher wird LocalDB für die Arbeit mit .mdf Dateien empfohlen. LocalDB ist standardmäßig mit Visual Studio installiert.
In der Regel wird SQL Server Express nicht für Produktionswebanwendungen verwendet. LocalDB wird insbesondere nicht für die Verwendung in der Produktion mit einer Webanwendung empfohlen, da sie nicht für die Arbeit mit IIS konzipiert ist.
In diesem Lernprogramm arbeiten Sie mit LocalDB. Öffnen Sie die Datei "Web.config" der Anwendung, und fügen Sie ein
connectionStrings
Element vor demappSettings
Element hinzu, wie im folgenden Beispiel gezeigt. (Stellen Sie sicher, dass Sie die Datei "Web.config" im Stammprojektordner. Es gibt auch eine Web.config-Datei im Unterordner "Views ", die Sie nicht aktualisieren müssen.)<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>
Die hinzugefügte Verbindungszeichenfolge gibt an, dass Entity Framework eine LocalDB-Datenbank namens ContosoUniversity1.mdf verwendet. (Die Datenbank ist noch nicht vorhanden, aber EF erstellt sie.) Wenn Sie die Datenbank in Ihrem App_Data Ordner erstellen möchten, können Sie dem Verbindungszeichenfolge hinzufügenAttachDBFilename=|DataDirectory|\ContosoUniversity1.mdf
. Weitere Informationen zu Verbindungszeichenfolge finden Sie unter SQL Server-Verbindungszeichenfolgen für ASP.NET Webanwendungen.
Sie benötigen in der Datei "Web.config" keine Verbindungszeichenfolge. Wenn Sie keine Verbindungszeichenfolge bereitstellen, verwendet Entity Framework basierend auf Ihrer Kontextklasse eine Standard-Verbindungszeichenfolge. Weitere Informationen finden Sie unter Code First to a New Database.
Erstellen Sie Controller und Ansichten
Jetzt erstellen Sie eine Webseite zum Anzeigen von Daten. Der Vorgang zum Anfordern der Daten löst automatisch die Erstellung der Datenbank aus. Sie beginnen mit dem Erstellen eines neuen Controllers. Erstellen Sie jedoch vorher das Projekt, um das Modell und die Kontextklassen für das MVC-Controllergerüst zur Verfügung zu stellen.
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf den Ordner "Controller", wählen Sie "Hinzufügen" aus, und klicken Sie dann auf "Neues Gerüstelement".
Wählen Sie im Dialogfeld "Gerüst hinzufügen" den MVC 5-Controller mit Ansichten, mithilfe von Entity Framework und dann "Hinzufügen" aus.
Treffen Sie im Dialogfeld "Controller hinzufügen" die folgenden Auswahlmöglichkeiten, und wählen Sie dann "Hinzufügen" aus:
Modellklasse: Student (ContosoUniversity.Models). (Wenn diese Option in der Dropdownliste nicht angezeigt wird, erstellen Sie das Projekt, und versuchen Sie es erneut.)
Datenkontextklasse: SchoolContext (ContosoUniversity.DAL).
Controllername: StudentController (nicht StudentController).
Übernehmen Sie in den restlichen Feldern die Standardwerte.
Wenn Sie auf "Hinzufügen" klicken, erstellt das Gerüst eine StudentController.cs Datei und eine Reihe von Ansichten (CSHTML-Dateien), die mit dem Controller arbeiten. Wenn Sie In Zukunft Projekte erstellen, die Entity Framework verwenden, können Sie auch einige zusätzliche Funktionen des Gerüsts nutzen: Erstellen Sie Ihre erste Modellklasse, erstellen Sie keine Verbindungszeichenfolge, und geben Sie dann im Feld "Controller hinzufügen" den Neuen Datenkontext an, indem Sie die Schaltfläche neben der + Datenkontextklasse auswählen. Das Gerüst erstellt Ihre
DbContext
Klasse und Ihre Verbindungszeichenfolge sowie den Controller und ansichten.
Visual Studio öffnet die Datei "Controller\StudentController.cs ". Sie sehen, dass eine Klassenvariable erstellt wurde, die ein Datenbankkontextobjekt instanziiert:
private SchoolContext db = new SchoolContext();
Die
Index
Aktionsmethode ruft eine Liste der Kursteilnehmer aus der Entität "Studenten " ab, indem sie dieStudents
Eigenschaft der Datenbankkontextinstanz lesen:public ViewResult Index() { return View(db.Students.ToList()); }
In der Ansicht "Student\Index.cshtml " wird diese Liste in einer Tabelle angezeigt:
<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> }
Drücken Sie STRG+F5, um das Projekt auszuführen. (Wenn ein Fehler "Schattenkopie kann nicht erstellt werden" angezeigt wird, schließen Sie den Browser, und versuchen Sie es erneut.)
Klicken Sie auf die Registerkarte "Kursteilnehmer ", um die von der
Seed
Methode eingefügten Testdaten anzuzeigen. Je nachdem, wie schmal Ihr Browserfenster ist, wird der Registerkartenlink "Kursteilnehmer" in der oberen Adressleiste angezeigt, oder Sie müssen auf die obere rechte Ecke klicken, um den Link anzuzeigen.
Zeigen Sie die Datenbank an
Wenn Sie die Seite "Kursteilnehmer" ausgeführt haben und die Anwendung versucht hat, auf die Datenbank zuzugreifen, hat EF festgestellt, dass keine Datenbank vorhanden war und eine datenbank erstellt wurde. EF hat dann die Seed-Methode ausgeführt, um die Datenbank mit Daten aufzufüllen.
Sie können entweder Server-Explorer oder SQL Server-Objekt-Explorer (SSOX) verwenden, um die Datenbank in Visual Studio anzuzeigen. In diesem Lernprogramm verwenden Sie den Server-Explorer.
Schließen Sie den Browser.
Erweitern Sie im Server-Explorer Datenverbindungen (möglicherweise müssen Sie zuerst die Schaltfläche "Aktualisieren" auswählen), "School Context (ContosoUniversity)" und dann "Tabellen" erweitern, um die Tabellen in Ihrer neuen Datenbank anzuzeigen.
Klicken Sie mit der rechten Maustaste auf die Tabelle "Student ", und klicken Sie auf " Tabellendaten anzeigen", um die erstellten Spalten und die Zeilen anzuzeigen, die in die Tabelle eingefügt wurden.
Schließen Sie die Server-Explorer-Verbindung .
Die ContosoUniversity1.mdf- und LDF-Datenbankdateien befinden sich im Ordner %USERPROFILE%.
Da Sie den DropCreateDatabaseIfModelChanges
Initialisierer verwenden, können Sie jetzt eine Änderung an der Student
Klasse vornehmen, die Anwendung erneut ausführen, und die Datenbank würde automatisch neu erstellt werden, um Ihrer Änderung zu entsprechen. Wenn Sie dem Kurs beispielsweise eine EmailAddress
Eigenschaft Student
hinzufügen, die Seite "Kursteilnehmer" erneut ausführen und dann erneut die Tabelle anzeigen, wird eine neue EmailAddress
Spalte angezeigt.
Konventionen
Die Menge des Codes, den Sie schreiben mussten, damit Entity Framework eine vollständige Datenbank für Sie erstellen kann, ist aufgrund von Konventionen oder Annahmen, die Entity Framework vorgibt, minimal. Einige von ihnen wurden bereits erwähnt oder wurden verwendet, ohne dass Sie sie kennen:
- Die pluralisierten Formen von Entitätsklassennamen werden als Tabellennamen verwendet.
- Eigenschaftennamen von Entitäten werden als Spaltennamen verwendet.
- Entitätseigenschaften, die benannt
ID
oder klassennameID
sind, werden als Primärschlüsseleigenschaften erkannt. - Eine Eigenschaft wird als Fremdschlüsseleigenschaft interpretiert, wenn sie den Namen <Name der Navigationseigenschaft><Eigenschaftenname des Primärschlüssels> hat (z. B.
StudentID
für dieStudent
-Navigationseigenschaft, da der Primärschlüssel derStudent
-EntitätID
lautet). Fremdschlüsseleigenschaften können auch denselben namen, der einfach <nur der Primärschlüsseleigenschaftsname> ist (zEnrollmentID
. B. da der Primärschlüssel derEnrollment
Entität istEnrollmentID
).
Sie haben gesehen, dass Konventionen überschrieben werden können. Sie haben z. B. angegeben, dass Tabellennamen nicht pluralisiert werden sollen, und sie werden später sehen, wie Sie eine Eigenschaft explizit als Fremdschlüsseleigenschaft markieren.
Abrufen des Codes
Abgeschlossenes Projekt herunterladen
Zusätzliche Ressourcen
Weitere Informationen zu EF 6 finden Sie in den folgenden Artikeln:
Nächste Schritte
In diesem Tutorial haben Sie:
- Erstellen einer MVC-Web-App
- Einrichten des Websitestils
- Installiertes Entity Framework 6
- Haben Sie das Datenmodell erstellt
- Haben Sie den Datenbankkontext erstellt
- Haben Sie die Datenbank mit Testdaten initialisiert
- Einrichten von EF 6 für die Verwendung von LocalDB
- Haben Sie Controller und Ansichten erstellt
- Haben Sie die Datenbank angezeigt
Wechseln Sie zum nächsten Artikel, um zu erfahren, wie Sie den CRUD-Code (Create, Read, Update, Delete) in Ihren Controllern und Ansichten überprüfen und anpassen.