Tutorial: Erste Schritte mit Entity Framework 6 Code First mit MVC 5

Hinweis

Für Neuentwicklungen wird empfohlen, Razor Pages über ASP.NET MVC-Controller und -Ansichten zu ASP.NET Core. Eine Tutorialreihe, die mit Razor Pages vergleichbar ist, finden Sie unter Tutorial: Erste Schritte mit Razor Pages in ASP.NET Core. Das neue Tutorial:

  • 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 Tutorials erfahren Sie, wie Sie eine ASP.NET MVC 5-Anwendung erstellen, die Entity Framework 6 für den Datenzugriff verwendet. In diesem Tutorial wird der Code First-Workflow verwendet. Informationen zur Auswahl zwischen Code First, Database First und Model First finden Sie unter Erstellen eines Modells.

In dieser Tutorialreihe wird erläutert, wie Sie die Beispielanwendung contoso University 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:

Students_Index_page

Kursteilnehmer bearbeiten

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

  1. Öffnen Sie Visual Studio, und erstellen Sie ein C#-Webprojekt mithilfe der vorlage ASP.NET Webanwendung (.NET Framework). Nennen Sie das Projekt ContosoUniversity, und wählen Sie OK aus.

    Dialogfeld

  2. Wählen Sie unter Neue ASP.NET Webanwendung – ContosoUniversitydie Option MVC aus.

    Dialogfeld

    Hinweis

    Standardmäßig ist die Authentifizierungsoption auf Keine Authentifizierung festgelegt. Für dieses Tutorial erfordert die Web-App keine Anmeldung von Benutzern. Außerdem schränkt es den Zugriff nicht basierend darauf ein, wer angemeldet ist.

  3. 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.

  1. Öffnen Sie Views\Shared\_Layout.cshtml, und nehmen Sie die folgenden Änderungen vor:

    • Ändern Sie jedes Vorkommen von "Meine ASP.NET-Anwendung" und "Anwendungsname" in "Contoso University".
    • Fügen Sie Menüeinträge für Studenten, Kurse, Dozenten und Abteilungen hinzu, und löschen Sie den Eintrag Kontakt.

    Die Änderungen sind 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>&copy; @DateTime.Now.Year - Contoso University</p>
            </footer>
        </div>
    
        @Scripts.Render("~/bundles/jquery")
        @Scripts.Render("~/bundles/bootstrap")
        @RenderSection("scripts", required: false)
    </body>
    </html>
    
  2. Ersetzen Sie in Views\Home\Index.cshtml den Inhalt der Datei durch den folgenden Code, um den Text über 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 &raquo;</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 &raquo;</a></p>
        </div>
    </div>
    
  3. Drücken Sie STRG+F5, um die Website auszuführen. Sie sehen die Startseite mit dem menü Standard.

Installieren von Entity Framework 6

  1. Wählen Sie im Menü Extrasdie Option NuGet-Paket-Manager und dann Paket-Manager-Konsole aus.

  2. Geben Sie im Fenster Paket-Manager-Konsole den folgenden Befehl ein:

    Install-Package EntityFramework
    

Dieser Schritt ist einer von wenigen Schritten, die Sie in diesem Tutorial manuell ausführen, aber dies hätte automatisch durch das ASP.NET MVC-Gerüstbaufeatures erfolgen können. Sie führen diese manuell aus, sodass Sie die schritte anzeigen können, die für die Verwendung von Entity Framework (EF) erforderlich sind. Sie verwenden später das Gerüst, um den MVC-Controller und die MVC-Ansichten zu erstellen. Alternativ können Sie das EF NuGet-Paket automatisch installieren, die Datenbankkontextklasse erstellen und die Verbindungszeichenfolge erstellen. Wenn Sie dazu bereit sind, müssen Sie nur diese Schritte überspringen und Ihren MVC-Controller nach dem Erstellen Ihrer Entitätsklassen gerüstet 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:

Kurs<->Enrollment-Student<>

Entitäten Beziehung
Kurs zur Registrierung 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 mit der Erstellung all dieser Entitätsklassen fertig sind, erhalten Sie Compilerfehler.

Die Entität „Student“

  • Erstellen Sie im Ordner Models die Klassendatei Student.cs, indem Sie mit der rechten Maustaste auf den Ordner in Projektmappen-Explorer klicken undKlassehinzufü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 mit dem Namen ID oder KlassennameID als Primärschlüssel.

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 verbunden sind. Mit anderen Worten, wenn eine bestimmte Student Zeile in der Datenbank zwei verwandte Enrollment Zeilen enthält (Zeilen, die den Primärschlüsselwert dieses Kursteilnehmers in der StudentID Fremdschlüsselspalte enthalten), enthält die Navigationseigenschaft dieser StudentEnrollments Entität diese beiden Enrollment Entitäten.

Navigationseigenschaften werden in der Regel als virtual definiert, damit sie bestimmte Entity Framework-Funktionen nutzen können, z. B. das verzögerte Laden. (Das verzögerte Laden wird später im Tutorial Lesen verwandter Daten weiter unten in dieser Reihe erläutert.)

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 Muster "KlassennameID " anstelle von ID allein, 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 Tutorial erfahren Sie, wie die Verwendung ohne IDclassname die Implementierung der Vererbung im Datenmodell erleichtert.

Die Grade Eigenschaft ist eine Enumeration. Das Fragezeichen nach der Grade-Typdeklaration gibt an, dass die Grade-Eigenschaft NULL-Werte zulässt. Eine Note, die NULL ist, unterscheidet sich von einer Null-Note– null bedeutet, dass eine Note 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 sie den Namen> der Navigationseigenschaft><Name der Primärschlüsseleigenschaft hat< (z. B. für die Student Navigationseigenschaft, StudentID da der Primärschlüssel der Student Entität istID). Fremdschlüsseleigenschaften können auch denselben einfachen <Primärschlüsseleigenschaftennamen> erhalten (z. B. CourseID da der Primärschlüssel der Course Entität ist CourseID).

Die Entität „Course“

  • Erstellen Sie im Ordner ModelsCourse.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.

Weitere Informationen zum DatabaseGeneratedAttribute-Attribut erhalten Sie in einem späteren Tutorial dieser Reihe. 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 Standard-Klasse, 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 ableiten. Im 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 Projekt ContosoUniversity zu erstellen, klicken Sie mit der rechten Maustaste auf das Projekt in Projektmappen-Explorer, klicken Sie auf Hinzufügen, und klicken Sie dann auf Neuer Ordner. Nennen Sie den neuen Ordner DAL (für Datenzugriffsebene). 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 jede Entitätsgruppe. In der Entity Framework-Terminologie 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> weglassen, und es würde genauso funktionieren. Entity Framework würde sie implizit einschließen, da die Student Entität auf die Enrollment Entität verweist und die Enrollment Entität auf die Course Entität verweist.

Angeben der Verbindungszeichenfolge

Der Name der Verbindungszeichenfolge (die Sie der Web.config-Datei später hinzufügen) wird an den Konstruktor übergeben.

public SchoolContext() : base("SchoolContext")
{
}

Sie können auch die Verbindungszeichenfolge selbst anstelle des Namens übergeben, der in der Web.config-Datei gespeichert ist. Weitere Informationen zu Optionen zum Angeben der zu verwendenden Datenbank finden Sie unter Verbindungszeichenfolgen und -modelle.

Wenn Sie weder explizit eine Verbindungszeichenfolge noch den Namen einer Verbindungszeichenfolge angeben, geht Entity Framework davon aus, dass der Name der Verbindungszeichenfolge mit dem Klassennamen identisch ist. Der Standardname der Verbindungszeichenfolge in diesem Beispiel wäre SchoolContextdann derselbe wie der, den Sie explizit angeben.

Singuläre Tabellennamen angeben

Die modelBuilder.Conventions.Remove -Anweisung in der OnModelCreating-Methode verhindert, dass Tabellennamen pluralisiert werden. Wenn Sie dies nicht getan haben, werden die generierten Tabellen in der Datenbank mit den Namen , Coursesund EnrollmentsbenanntStudents. Stattdessen sind Studentdie Tabellennamen , Courseund Enrollment. Entwickler sind sich uneinig darüber, ob Tabellennamen im Plural stehen sollten oder nicht. In diesem Tutorial wird das singulare Formular verwendet, aber der wichtige Punkt ist, dass Sie das gewünschte Formular auswählen können, indem Sie diese Codezeile einschließen oder weglassen.

Initialisieren Sie die Datenbank mit Testdaten

Entity Framework kann automatisch eine Datenbank für Sie erstellen (oder löschen und neu erstellen), wenn die Anwendung ausgeführt wird. Sie können angeben, dass dies jedes Mal erfolgen soll, wenn Ihre Anwendung ausgeführt wird, 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 auslöst, wenn sich das Modell geändert hat 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. Das Löschen der Datenbank führt zum Verlust aller Daten. Dies ist während der Entwicklung in der Regel in Ordnung, da die Seed Methode ausgeführt wird, wenn die Datenbank neu erstellt wird und Ihre Testdaten neu erstellt wird. In der Produktion möchten Sie jedoch in der Regel nicht alle Ihre Daten jedes Mal verlieren, wenn Sie das Datenbankschema ändern müssen. 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 neu zu erstellen.

  1. 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 wird 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 entsprechenden DbSet Eigenschaft hinzu und speichert dann die Änderungen in der Datenbank. Es ist nicht erforderlich, die SaveChanges -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.

  2. Um Entity Framework anweisen zu können, Ihre Initialisiererklasse zu verwenden, fügen Sie dem Element in der entityFramework AnwendungWeb.config Datei (das Element im Stammprojektordner) ein Element 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>
    

    Gibt context type den vollqualifizierten Kontextklassennamen und die Assembly an, in der sie sich befindet, und gibt databaseinitializer type den vollqualifizierten Namen der Initialisiererklasse und der Assembly an, in der sie sich befindet. (Wenn Sie nicht möchten, dass EF den Initialisierer verwendet, können Sie ein Attribut für das context -Element festlegen: disableDatabaseInitialization="true".) Weitere Informationen finden Sie unter Konfigurationsdateieinstellungen.

    Eine Alternative zum Festlegen des Initialisierers in der Web.config-Datei besteht darin, dies im Code zu tun, indem Sie der -Methode in der Application_Start Datei Global.asax.cs eine Database.SetInitializer Anweisung hinzufügen. Weitere Informationen finden Sie unter Grundlegendes zu Datenbankinitialisierern 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 es einen Unterschied gibt, wird die Datenbank von der Anwendung gelöscht und neu erstellt.

Hinweis

Wenn Sie eine Anwendung auf einem Produktionswebserver bereitstellen, müssen Sie Code entfernen oder deaktivieren, durch den die Datenbank gelöscht und neu erstellt wird. Dies geschieht in einem späteren Tutorial in dieser Reihe.

Einrichten von EF 6 für die Verwendung von LocalDB

LocalDB ist eine einfache Version der SQL Server Express Datenbank-Engine. 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 App_Data Ordner eines Webprojekts ablegen, wenn Sie die Datenbank mit dem Projekt kopieren möchten. Das Benutzer-instance-Feature in SQL Server Express ermöglicht ihnen auch die Arbeit mit MDF-Dateien, aber das Feature für benutzer instance ist veraltet. Daher wird LocalDB für die Arbeit mit MDF-Dateien empfohlen. LocalDB wird standardmäßig mit Visual Studio installiert.

In der Regel wird SQL Server Express nicht für Produktionswebanwendungen verwendet. LocalDB wird insbesondere für die Produktionsverwendung mit einer Webanwendung nicht empfohlen, da sie nicht für die Verwendung mit IIS konzipiert ist.

  • In diesem Tutorial arbeiten Sie mit LocalDB. Öffnen Sie die Anwendung Web.config Datei, und fügen Sie ein connectionStrings Element vor dem appSettings Element hinzu, wie im folgenden Beispiel gezeigt. (Stellen Sie sicher, dass Sie die Web.config-Datei im Stammprojektordner aktualisieren. Es gibt auch eine Web.config Datei im Unterordner Ansichten , 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 mit dem Namen 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 der Verbindungszeichenfolge hinzufügen AttachDBFilename=|DataDirectory|\ContosoUniversity1.mdf . Weitere Informationen zu Verbindungszeichenfolgen finden Sie unter SQL Server Verbindungszeichenfolgen für ASP.NET Webanwendungen.

Sie benötigen keine Verbindungszeichenfolge in der Web.config-Datei . Wenn Sie keine Verbindungszeichenfolge bereitstellen, verwendet Entity Framework eine Standardverbindungszeichenfolge basierend auf Ihrer Kontextklasse. Weitere Informationen finden Sie unter Code First to a New Database .

Erstellen Sie Controller und Ansichten

Nun erstellen Sie eine Webseite zum Anzeigen von Daten. Das Anfordern der Daten löst automatisch die Erstellung der Datenbank aus. Sie beginnen mit dem Erstellen eines neuen Controllers. Erstellen Sie jedoch zuvor das Projekt, um die Modell- und Kontextklassen für das MVC-Controllergerüst verfügbar zu machen.

  1. Klicken Sie mit der rechten Maustaste auf den Ordner Controller in Projektmappen-Explorer, wählen Sie Hinzufügen aus, und klicken Sie dann auf Neues Gerüstelement.

  2. Wählen Sie im Dialogfeld Gerüst hinzufügendie Option MVC 5 Controller mit Ansichten mithilfe von Entity Framework aus, und wählen Sie dann Hinzufügen aus.

    Dialogfeld

  3. Treffen Sie im Dialogfeld Controller hinzufügen die folgenden Optionen, 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 StudentsController).

    • Behalten Sie die Standardwerte für die anderen Felder bei.

      Wenn Sie auf Hinzufügen klicken, erstellt der Gerüstordner eine Datei StudentController.cs und eine Reihe von Ansichten (CSHTML-Dateien ), die mit dem Controller funktionieren. Wenn Sie in Zukunft Projekte erstellen, die Entity Framework verwenden, können Sie auch einige zusätzliche Funktionen des Gerüstbauwerks nutzen: Erstellen Sie Ihre erste Modellklasse, erstellen Sie keine Verbindungszeichenfolge, und geben Sie dann im Feld Controller hinzufügenneue Datenkontext an, indem Sie die + Schaltfläche neben data context class auswählen. Das Gerüst erstellt Ihre DbContext Klasse und Ihre Verbindungszeichenfolge sowie den Controller und die Ansichten.

  4. 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 von Kursteilnehmern aus der Entität Students ab, die festgelegt ist, indem die Students Eigenschaft des Datenbankkontexts instance gelesen wird:

    public ViewResult Index()
    {
        return View(db.Students.ToList());
    }
    

    Die Ansicht Student\Index.cshtml zeigt diese Liste in einer Tabelle an:

    <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>
    }
    
  5. Drücken Sie STRG+F5, um das Projekt auszuführen. (Wenn die Fehlermeldung "Schattenkopie kann nicht erstellt werden" angezeigt wird, schließen Sie den Browser, und versuchen Sie es erneut.)

    Klicken Sie auf die Registerkarte Schüler , um die von der Methode eingefügten Seed Testdaten anzuzeigen. Je nachdem, wie eng Ihr Browserfenster ist, wird in der oberen Adressleiste der Link der Registerkarte Student angezeigt, oder Sie müssen auf die obere rechte Ecke klicken, um den Link anzuzeigen.

    Menü-Taste

Zeigen Sie die Datenbank an

Als Sie die Seite "Kursteilnehmer" ausgeführt haben und die Anwendung versucht hat, auf die Datenbank zuzugreifen, hat EF festgestellt, dass es keine Datenbank gab, und eine datenbank erstellt. EF führte dann die Seed-Methode aus, 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 Tutorial verwenden Sie Server Explorer.

  1. Schließen Sie den Browser.

  2. Erweitern Sie in Server Explorer den Eintrag Datenverbindungen (möglicherweise müssen Sie zuerst die Schaltfläche aktualisieren auswählen), Den Schulkontext (ContosoUniversity) und dann Tabellen, um die Tabellen in Ihrer neuen Datenbank anzuzeigen.

  3. 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.

  4. Schließen Sie die Verbindung server Explorer.

Die Datenbankdateien ContosoUniversity1.mdf und .ldf 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 wird automatisch neu erstellt, um Ihrer Änderung zu entsprechen. Wenn Sie der Klasse beispielsweise eine EmailAddress Eigenschaft hinzufügen, die Student Seite Schüler erneut ausführen und dann die Tabelle erneut ansehen, wird eine neue EmailAddress Spalte angezeigt.

Konventionen

Die Menge an Code, die Sie schreiben mussten, damit Entity Framework eine vollständige Datenbank für Sie erstellen kann, ist aufgrund von Konventionen oder Annahmen, die Entity Framework trifft, minimal. Einige von ihnen wurden bereits notiert oder wurden verwendet, ohne dass Sie sich dessen bewusst waren:

  • Die pluralisierten Formen von Entitätsklassennamen werden als Tabellennamen verwendet.
  • Eigenschaftennamen von Entitäten werden als Spaltennamen verwendet.
  • Entitätseigenschaften mit dem Namen ID oder KlassennameID 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 die Student-Navigationseigenschaft, da der Primärschlüssel der Student -Entität ID lautet). Fremdschlüsseleigenschaften können auch denselben einfachen Primärschlüsseleigenschaftennamen> erhalten (z. B. EnrollmentID da der Primärschlüssel der Enrollment 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 sehen später, wie eine Eigenschaft explizit als Fremdschlüsseleigenschaft gekennzeichnet werden kann.

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:

  • Erstellen einer MVC-Web-App
  • Einrichten des Websitestils
  • Installation von 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

Fahren Sie mit dem nächsten Artikel fort, um zu erfahren, wie Sie den CRUD-Code (Erstellen, Lesen, Aktualisieren, Löschen) in Ihren Controllern und Ansichten überprüfen und anpassen können.