Kurz: Začínáme s Entity Framework 6 Code First pomocí MVC 5
Poznámka
Pro nový vývoj doporučujeme ASP.NET Core Razor Pages před ASP.NET kontrolery a zobrazeními MVC. Podobnou řadu kurzů s využitím razor Pages najdete v tématu Kurz: Začínáme s Razor Pages v ASP.NET Core. Nový kurz:
- Je snazší ho sledovat.
- Poskytuje další osvědčené postupy EF Core.
- Používá efektivnější dotazy.
- Je aktuální s nejnovějším rozhraním API.
- Zahrnuje další funkce.
- Je upřednostňovaný přístup pro vývoj nových aplikací.
V této sérii kurzů se naučíte vytvořit aplikaci ASP.NET MVC 5, která pro přístup k datům používá Entity Framework 6. V tomto kurzu se používá pracovní postup Code First. Informace o tom, jak si vybrat mezi kódy Code First, Database First a Model First, najdete v tématu Vytvoření modelu.
Tato série kurzů vysvětluje, jak sestavit ukázkovou aplikaci Contoso University. Ukázková aplikace je jednoduchý univerzitní web. Díky tomu můžete zobrazit a aktualizovat informace o studentech, kurzech a instruktorech. Tady jsou dvě obrazovky, které vytvoříte:
V tomto kurzu jste:
- Vytvoření webové aplikace MVC
- Nastavení stylu webu
- Instalace Entity Frameworku 6
- Vytvoření datového modelu
- Vytvoření kontextu databáze
- Inicializace databáze pomocí testovacích dat
- Nastavení EF 6 pro použití LocalDB
- Vytvoření kontroleru a zobrazení
- Zobrazení databáze
Požadavky
Vytvoření webové aplikace MVC
Otevřete Visual Studio a vytvořte webový projekt jazyka C# pomocí šablony ASP.NET Web Application (.NET Framework). Pojmenujte projekt ContosoUniversity a vyberte OK.
V části Nová webová aplikace ASP.NET – ContosoUniversity vyberte MVC.
Poznámka
Ve výchozím nastavení je možnost Ověřování nastavená na Bez ověřování. Pro účely tohoto kurzu webová aplikace nevyžaduje, aby se uživatelé přihlásili. Navíc neomezuje přístup na základě toho, kdo je přihlášený.
Vyberte OK a vytvořte projekt.
Nastavení stylu webu
Několik jednoduchých změn nastaví nabídku webu, rozložení a domovskou stránku.
Otevřete Views\Shared\_Layout.cshtml a proveďte následující změny:
- Změňte každý výskyt "Moje aplikace ASP.NET" a "Název aplikace" na "Contoso University".
- Přidejte položky nabídky pro studenty, kurzy, instruktory a oddělení a odstraňte položku Kontakt.
Změny jsou zvýrazněné v následujícím fragmentu kódu:
<!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>
V souboru Views\Home\Index.cshtml nahraďte obsah souboru následujícím kódem, který nahradí text o ASP.NET a MVC textem o této aplikaci:
@{ 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>
Stisknutím kombinace kláves Ctrl+F5 spusťte web. Zobrazí se domovská stránka s hlavní nabídkou.
Instalace Entity Frameworku 6
V nabídce Nástroje zvolte Správce balíčků NuGet a pak zvolte Konzola Správce balíčků.
V okně konzoly Správce balíčků zadejte následující příkaz:
Install-Package EntityFramework
Tento krok je jedním z několika kroků, které jste v tomto kurzu provedli ručně, ale mohl být proveden automaticky funkcí generování ASP.NET MVC. Provádíte je ručně, abyste viděli kroky potřebné k použití Entity Frameworku (EF). Později použijete generování uživatelského rozhraní k vytvoření kontroleru A zobrazení MVC. Alternativou je nechat generování automaticky nainstalovat balíček NuGet EF, vytvořit třídu kontextu databáze a vytvořit připojovací řetězec. Až budete připravení to udělat tímto způsobem, stačí tyto kroky přeskočit a po vytvoření tříd entit vygenerovat kontroler MVC.
Vytvoření datového modelu
Dále vytvoříte třídy entit pro aplikaci Contoso University. Začnete s následujícími třemi entitami:
Kurz<->Enrollment-Student<>
Entity | Relace |
---|---|
Kurz k registraci | 1:N |
Od studenta k registraci | 1:N |
Mezi entitami a Enrollment
existuje relace Student
1:N a mezi Course
entitami a Enrollment
existuje relace 1:N. Jinými slovy, student může být zapsán do libovolného počtu kurzů a kurz může mít libovolný počet studentů.
V následujících částech vytvoříte třídu pro každou z těchto entit.
Poznámka
Pokud se před vytvořením všech těchto tříd entit pokusíte projekt zkompilovat, zobrazí se chyby kompilátoru.
Entita Student
Ve složce Models (Modely) vytvořte soubor třídy Student.cs tak, že kliknete pravým tlačítkem na složku v Průzkumník řešení a zvolíte Přidat>třídu. Nahraďte kód šablony následujícím kódem:
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; } } }
Vlastnost ID
se stane sloupcem primárního klíče databázové tabulky, která odpovídá této třídě. Ve výchozím nastavení Entity Framework interpretuje vlastnost s názvem ID
nebo classnameID
jako primární klíč.
Vlastnost Enrollments
je navigační vlastnost. Navigační vlastnosti obsahují další entity, které s touto entitou souvisejí. V tomto případě Enrollments
bude vlastnost Student
entity obsahovat všechny Enrollment
entity, které s touto Student
entitou souvisejí. Jinými slovy, pokud má daný Student
řádek v databázi dva související Enrollment
řádky (řádky, které obsahují hodnotu primárního klíče daného studenta Enrollments
ve StudentID
sloupci cizího klíče), Student
bude navigační vlastnost této entity obsahovat tyto dvě Enrollment
entity.
Vlastnosti navigace jsou obvykle definovány tak virtual
, aby mohly využívat určité funkce Entity Frameworku, jako je opožděné načítání. (Opožděné načítání bude vysvětleno později v kurzu Čtení souvisejících dat dále v této sérii.)
Pokud navigační vlastnost může obsahovat více entit (například v relacích M:N nebo 1:N), musí být jejím typem seznam, ve kterém lze přidávat, odstraňovat a aktualizovat položky, například ICollection
.
Entita Registrace
Ve složce Models (Modely ) vytvořte Enrollment.cs a nahraďte existující kód následujícím kódem:
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; } } }
Vlastnost EnrollmentID
bude primárním klíčem. Tato entita místo sebe používá vzor ID
classnameID
, jak jste viděli v entitěStudent
. Obvykle byste zvolili jeden vzor a použili ho v celém datovém modelu. V této variantě je vidět, že můžete použít oba vzory. V pozdějším kurzu se dozvíte, jak použití ID
bez classname
usnadňuje implementaci dědičnosti v datovém modelu.
Vlastnost Grade
je výčet. Otazník za Grade
deklarací typu označuje, že Grade
vlastnost je null. Známka, která má hodnotu null, se liší od nulové známky – null znamená, že známka není známa nebo ještě nebyla přiřazena.
Vlastnost StudentID
je cizí klíč a odpovídající navigační vlastnost je Student
. Entita Enrollment
je přidružená k jedné Student
entitě, takže vlastnost může obsahovat pouze jednu Student
entitu (na rozdíl od Student.Enrollments
navigační vlastnosti, kterou jste viděli dříve, která může obsahovat více Enrollment
entit).
Vlastnost CourseID
je cizí klíč a odpovídající navigační vlastnost je Course
. Entita Enrollment
je přidružená k jedné Course
entitě.
Entity Framework interpretuje vlastnost jako vlastnost cizího klíče, pokud má název <navigační vlastnosti název><primárního> klíče (například pro Student
vlastnost navigace, StudentID
protože Student
primární klíč entity je ID
). Vlastnosti cizího klíče lze také pojmenovat stejným jednoduchým <názvem> vlastnosti primárního klíče (například proto, CourseID
že Course
primární klíč entity je CourseID
).
Entita Kurz
Ve složce Models (Modely ) vytvořte Course.cs a nahraďte kód šablony následujícím kódem:
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; } } }
Vlastnost Enrollments
je navigační vlastnost. Entita Course
může souviset s libovolným počtem Enrollment
entit.
Další informace o atributu DatabaseGeneratedAttribute si řekneme v pozdějším kurzu v této sérii. Tento atribut v podstatě umožňuje zadat primární klíč pro kurz místo toho, aby ho vygenerovala databáze.
Vytvoření kontextu databáze
Hlavní třída, která koordinuje funkce Entity Framework pro daný datový model, je kontextová třída databáze . Tuto třídu vytvoříte odvozením z třídy System.Data.Entity.DbContext . V kódu určíte, které entity jsou součástí datového modelu. Můžete také přizpůsobit určité chování entity frameworku. V tomto projektu má třída název SchoolContext
.
Pokud chcete vytvořit složku v projektu ContosoUniversity, klikněte pravým tlačítkem na projekt v Průzkumník řešení, klikněte na Přidat a pak klikněte na Nová složka. Pojmenujte novou složku DAL (pro Data Access Layer). V této složce vytvořte nový soubor třídy s názvem SchoolContext.cs a nahraďte kód šablony následujícím kódem:
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>(); } } }
Zadání sad entit
Tento kód vytvoří vlastnost DbSet pro každou sadu entit. V terminologii Entity Framework sada entit obvykle odpovídá databázové tabulce a entita odpovídá řádku v tabulce.
Poznámka
Příkazy a DbSet<Course>
můžete vynechat DbSet<Enrollment>
a fungují stejně. Entity Framework by je zahrnul implicitně, protože entita Student
odkazuje na entitu Enrollment
a entita Enrollment
odkazuje na entitu Course
.
Zadání připojovacího řetězce
Název připojovacího řetězce (který později přidáte do souboru Web.config) se předá konstruktoru.
public SchoolContext() : base("SchoolContext")
{
}
Můžete také předat samotný připojovací řetězec místo názvu, který je uložený v souboru Web.config. Další informace o možnostech určení databáze, která se má použít, najdete v tématu Připojovací řetězce a modely.
Pokud nezadáte připojovací řetězec nebo název explicitně, Entity Framework předpokládá, že název připojovacího řetězce je stejný jako název třídy. Výchozí název připojovacího řetězce v tomto příkladu by pak byl SchoolContext
stejný, jaký explicitně zadáváte.
Zadání názvů tabulek s jednotným číslem
Příkaz modelBuilder.Conventions.Remove
v metodě OnModelCreating brání v pluralizaci názvů tabulek. Pokud byste to neudělali, vygenerované tabulky v databázi by se jmenovaly Students
, Courses
a Enrollments
. Místo toho budou Student
názvy tabulek , Course
a Enrollment
. Vývojáři nesouhlasí s tím, jestli mají být názvy tabulek v množném čísle nebo ne. V tomto kurzu se používá jednotný formulář, ale důležité je, že můžete vybrat ten, který dáváte přednost zahrnutím nebo vynecháním tohoto řádku kódu.
Inicializace databáze pomocí testovacích dat
Entity Framework může automaticky vytvořit (nebo odstranit a znovu vytvořit) databázi při spuštění aplikace. Můžete určit, že se to má provést při každém spuštění aplikace nebo pouze v případě, že model není synchronizovaný s existující databází. Můžete také napsat metodu Seed
, kterou Entity Framework automaticky volá po vytvoření databáze a naplní ji testovacími daty.
Výchozím chováním je vytvoření databáze pouze v případě, že neexistuje (a vyvolání výjimky, pokud se model změnil a databáze již existuje). V této části určíte, že databáze se má odstranit a znovu vytvořit při každé změně modelu. Vyřazení databáze způsobí ztrátu všech dat. To je obecně v pořádku během vývoje, protože Seed
metoda se spustí při opětovném vytvoření databáze a znovu vytvoří testovací data. V produkčním prostředí ale obecně nechcete ztratit všechna data pokaždé, když potřebujete změnit schéma databáze. Později se dozvíte, jak zpracovávat změny modelu pomocí Migrace Code First ke změně schématu databáze místo odstranění a opětovného vytvoření databáze.
Ve složce DAL vytvořte nový soubor třídy s názvem SchoolInitializer.cs a nahraďte kód šablony následujícím kódem, který v případě potřeby vytvoří databázi a načte do nové databáze testovací data.
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
přebírá objekt kontextu databáze jako vstupní parametr a kód v metodě používá tento objekt k přidání nových entit do databáze. Pro každý typ entity kód vytvoří kolekci nových entit, přidá je do příslušnéDbSet
vlastnosti a pak uloží změny do databáze. Není nutné volat metoduSaveChanges
po každé skupině entit, jak je to tady, ale to vám pomůže najít zdroj problému, pokud dojde k výjimce, když kód zapisuje do databáze.Pokud chcete, aby Entity Framework používal vaši třídu inicializátoru, přidejte do elementu
entityFramework
v souboru aplikaceWeb.config (ten v kořenové složce projektu), jak je znázorněno v následujícím příkladu:<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>
Určuje
context type
plně kvalifikovaný název třídy kontextu a sestavení, ve které je, adatabaseinitializer type
určuje plně kvalifikovaný název třídy inicializátoru a sestavení, ve které je. (Pokud nechcete, aby EF používal inicializátor, můžete u elementucontext
nastavit atribut:disableDatabaseInitialization="true"
.) Další informace najdete v tématu Nastavení konfiguračního souboru.Alternativou k nastavení inicializátoru v souboruWeb.config je to provést v kódu přidáním
Database.SetInitializer
příkazu doApplication_Start
metody v souboru Global.asax.cs . Další informace najdete v tématu Principy inicializátorů databáze v Entity Framework Code First.
Aplikace je teď nastavená tak, aby při prvním přístupu k databázi v daném spuštění aplikace entity Framework porovnávala databázi s modelem (vaše SchoolContext
třídy a třídy entit). Pokud je rozdíl, aplikace se vyřazuje a znovu vytvoří databázi.
Poznámka
Když nasadíte aplikaci na produkční webový server, musíte odebrat nebo zakázat kód, který databázi odstraní a znovu vytvoří. Uděláte to v pozdějším kurzu v této sérii.
Nastavení EF 6 pro použití LocalDB
LocalDB je odlehčená verze databázového stroje SQL Server Express. Snadno se instaluje a konfiguruje, spouští se na vyžádání a spouští se v uživatelském režimu. LocalDB běží ve speciálním režimu spouštění SQL Server Express, který umožňuje pracovat s databázemi jako soubory .mdf. Pokud chcete mít možnost kopírovat databázi s projektem, můžete soubory databáze LocalDB umístit do složky App_Data webového projektu. Funkce instance uživatele v SQL Server Express také umožňuje pracovat se soubory .mdf, ale funkce instance uživatele je zastaralá. Proto se pro práci se soubory .mdf doporučuje LocalDB. LocalDB se ve výchozím nastavení instaluje se sadou Visual Studio.
SQL Server Express se obvykle nepoužívá pro produkční webové aplikace. Konkrétně localDB se nedoporučuje používat v produkčním prostředí s webovou aplikací, protože není navržený pro práci se službou IIS.
V tomto kurzu budete pracovat s LocalDB. Otevřete soubor aplikaceWeb.config a přidejte
connectionStrings
před element elementappSettings
, jak je znázorněno v následujícím příkladu. (Nezapomeňte aktualizovat souborWeb.config v kořenové složce projektu. V podsložce Views je také Web.config soubor, který nemusíte aktualizovat.)<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>
Připojovací řetězec, který jste přidali, určuje, že Entity Framework bude používat databázi LocalDB s názvem ContosoUniversity1.mdf. (Databáze ještě neexistuje, ale EF ji vytvoří.) Pokud chcete databázi vytvořit ve složce App_Data , můžete ji přidat AttachDBFilename=|DataDirectory|\ContosoUniversity1.mdf
do připojovacího řetězce. Další informace o připojovacích řetězcích najdete v tématu SQL Server Připojovací řetězce pro ASP.NET Web Applications.
Ve skutečnosti nepotřebujete připojovací řetězec v souboru Web.config . Pokud nezadáte připojovací řetězec, Entity Framework použije výchozí připojovací řetězec založený na třídě kontextu. Další informace najdete v tématu Code First to a New Database.For more information, see Code First to a New Database.
Vytvoření kontroleru a zobrazení
Teď vytvoříte webovou stránku pro zobrazení dat. Proces vyžádání dat automaticky aktivuje vytvoření databáze. Začnete vytvořením nového kontroleru. Než to ale uděláte, sestavte projekt tak, aby byly třídy modelu a kontextu dostupné pro generování řídicího rozhraní MVC.
Klikněte pravým tlačítkem na složku Controllers v Průzkumník řešení, vyberte Přidat a potom klikněte na Nová vygenerovaná položka.
V dialogovém okně Přidat generování uživatelského rozhraní vyberte Kontroler MVC 5 se zobrazeními pomocí Entity Frameworku a pak zvolte Přidat.
V dialogovém okně Přidat kontroler vyberte následující možnosti a pak zvolte Přidat:
Třída modelu: Student (ContosoUniversity.Models). (Pokud tuto možnost v rozevíracím seznamu nevidíte, sestavte projekt a zkuste to znovu.)
Třída kontextu dat: SchoolContext (ContosoUniversity.DAL).
Název kontroleru: StudentController (nikoli StudentsController).
Ponechte výchozí hodnoty pro ostatní pole.
Když kliknete na Přidat, scaffolder vytvoří soubor StudentController.cs a sadu zobrazení (soubory .cshtml ), které fungují s kontrolerem. V budoucnu při vytváření projektů, které používají Entity Framework, můžete také využít některé další funkce scaffolder: vytvořte první třídu modelu, nevytvářejte připojovací řetězec a pak v poli Přidat kontroler zadejte Nový datový kontext tak, že vyberete + tlačítko vedle třídy kontextu dat. Scaffolder vytvoří vaši
DbContext
třídu a připojovací řetězec a také kontroler a zobrazení.
Visual Studio otevře soubor Controllers\StudentController.cs . Uvidíte, že byla vytvořena proměnná třídy, která vytvoří instanci objektu kontextu databáze:
private SchoolContext db = new SchoolContext();
Metoda
Index
akce získá seznam studentů ze sady entit Studenti přečtenímStudents
vlastnosti instance kontextu databáze:public ViewResult Index() { return View(db.Students.ToList()); }
Zobrazení Student\Index.cshtml zobrazí tento seznam v tabulce:
<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> }
Stisknutím kláves Ctrl+F5 spusťte projekt. (Pokud se zobrazí chyba "Nelze vytvořit stínovou kopii", zavřete prohlížeč a zkuste to znovu.)
Kliknutím na kartu Studenti zobrazíte testovací data vložená metodou
Seed
. Podle toho, jak úzké je okno prohlížeče, uvidíte v horním panelu Adresa odkaz na kartu Student, nebo budete muset kliknout do pravého horního rohu, abyste odkaz viděli.
Zobrazení databáze
Když jste spustili stránku Studenti a aplikace se pokusila o přístup k databázi, EF zjistil, že neexistuje žádná databáze, a vytvořil ji. Ef pak spustil metodu seed, aby databázi naplnila daty.
K zobrazení databáze v sadě Visual Studio můžete použít Průzkumníka serveru nebo SQL Server Průzkumník objektů (SSOX). Pro účely tohoto kurzu použijete Průzkumník serveru.
Zavřete prohlížeč.
V Průzkumníku serveru rozbalte datová připojení (možná budete muset nejdřív vybrat tlačítko aktualizovat), rozbalte Kontext školy (ContosoUniversity) a pak rozbalte Tabulky , abyste viděli tabulky v nové databázi.
Klikněte pravým tlačítkem myši na tabulku Student a kliknutím na Zobrazit data tabulky zobrazte vytvořené sloupce a řádky vložené do tabulky.
Ukončete připojení Průzkumníka serveru .
Soubory databáze ContosoUniversity1.mdf a .ldf jsou ve složce %USERPROFILE%.
Vzhledem k tomu, že používáte DropCreateDatabaseIfModelChanges
inicializátor, můžete teď provést změnu Student
třídy, spustit aplikaci znovu a databáze by se automaticky znovu vytvořila tak, aby odpovídala vaší změně. Pokud například do předmětu Student
přidáte EmailAddress
vlastnost, znovu spusťte stránku Studenti a pak se znovu podívejte na tabulku, zobrazí se nový EmailAddress
sloupec.
Konvence
Množství kódu, který jste museli napsat, aby Entity Framework mohla vytvořit kompletní databázi za vás, je minimální z důvodu konvencí nebo předpokladů, které Entity Framework vytváří. Některé z nich už byly zaznamenány nebo byly použity, aniž byste o nich věděli:
- Jako názvy tabulek se používají pluralizované formy názvů tříd entit.
- Názvy vlastností entit se používají pro názvy sloupců.
- Vlastnosti entity s názvem
ID
nebo classnameID
jsou rozpoznány jako vlastnosti primárního klíče. - Vlastnost se interpretuje jako vlastnost cizího klíče, pokud má název <vlastnosti navigace název><primárního klíče> (například pro
Student
navigační vlastnost,StudentID
protožeStudent
primární klíč entity jeID
). Vlastnosti cizího klíče lze také pojmenovat stejným jednoduchým názvem vlastnosti primárního klíče (například proto,EnrollmentID
žeEnrollment
primární klíč entity jeEnrollmentID
).><
Viděli jste, že konvence se dají přepsat. Například jste určili, že názvy tabulek nemají být v množném čísle, a později uvidíte, jak explicitně označit vlastnost jako vlastnost cizího klíče.
Získání kódu
Další materiály
Další informace o EF 6 najdete v těchto článcích:
Další kroky
V tomto kurzu jste:
- Vytvoření webové aplikace MVC
- Nastavení stylu webu
- Nainstalované Entity Framework 6
- Vytvoření datového modelu
- Vytvořil se kontext databáze.
- Inicializovaná databáze s testovacími daty
- Nastavení EF 6 pro použití LocalDB
- Vytvoření kontroleru a zobrazení
- Zobrazení databáze
V dalším článku se dozvíte, jak zkontrolovat a přizpůsobit kód CRUD (vytvoření, čtení, aktualizace, odstranění) v řadičích a zobrazeních.
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro