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řes ASP.NET kontrolery a zobrazení MVC. Řadu kurzů, která je podobná té, která používá Razor Pages, najdete v tématu Kurz: Začínáme se stránkami Razor Pages v ASP.NET Core. Nový kurz:
- Je jednodušší postupovat.
- Poskytuje další osvědčené postupy EF Core.
- Používá efektivnější dotazy.
- Je aktuálnější s nejnovějším rozhraním API.
- Obsahuje další funkce.
- Je upřednostňovaným přístupem pro vývoj nových aplikací.
V této sérii kurzů se dozvíte, jak vytvořit ASP.NET aplikaci MVC 5, která pro přístup k datům používá Entity Framework 6. Tento kurz používá pracovní postup Code First. Informace o výběru mezi kódem 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ý web pro vysokoškoláky. Díky tomu můžete zobrazit a aktualizovat informace o studentech, kurzech a instruktorech. Tady jsou dvě obrazovky, které vytvoříte:
V tomto kurzu se naučíte:
- 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 s testovacími daty
- 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 nové ASP.NET webové aplikaci – 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. Kromě toho 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 ASP.NET Aplikace" 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 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 Správce balíčků Konzola.
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é tento kurz provádí ručně, ale to mohlo být provedeno 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í uživatelského rozhraní automaticky nainstalovat balíček EF NuGet, vytvořit třídu kontextu databáze a vytvořit připojovací řetězec. Až budete připraveni to udělat tímto způsobem, stačí tyto kroky přeskočit a vygenerovat kontroler MVC po vytvoření tříd entit.
Vytvoření datového modelu
V dalším kroku vytvoříte třídy entit pro aplikaci Contoso University. Začnete následujícími třemi entitami:
><Registrace< předmětu – student>
Entity | Vztah |
---|---|
Kurz registrace | 1:N |
Student do registrace | 1:N |
Mezi entitami existuje vztah Student
Enrollment
1:N a mezi entitami existuje vztah Course
Enrollment
1:N. Jinými slovy, student může být zapsán do libovolného počtu kurzů a kurz může mít v něm zaregistrovaný 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 Modely vytvořte soubor třídy s názvem 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 v tabulce databáze, která odpovídá této třídě. Ve výchozím nastavení Entity Framework interpretuje vlastnost, která má název ID
nebo název ID
třídy jako primární klíč.
Vlastnost Enrollments
je navigační vlastnost. Vlastnosti navigace obsahují další entity, které souvisejí s touto entitou. V tomto případě Enrollments
bude vlastnost Student
entity obsahovat všechny Enrollment
entity, které souvisejí s danou Student
entitou. 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 studenta ve StudentID
sloupci cizího klíče), Student
bude tato vlastnost navigace entity Enrollments
obsahovat tyto dvě Enrollment
entity.
Vlastnosti navigace jsou obvykle definovány tak virtual
, aby mohly využívat určité funkce Entity Framework, jako je opožděné načítání. (Opožděné načítání bude vysvětleno později v části Kurz čtení souvisejících dat dále v této sérii.)
Pokud navigační vlastnost může obsahovat více entit (jako v relacích M:N nebo 1:N), musí být jeho typ seznamem, ve kterém lze přidávat, odstraňovat a aktualizovat položky, například ICollection
.
Entita Registrace
Ve složce Models vytvořte Enrollment.cs a nahraďte stávají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; } } }
Tato EnrollmentID
vlastnost bude primárním klíčem. Tato entita používá vzor názvu ID
třídy místo ID
sebe sama, 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 znázorněno, že můžete použít některý ze vzorů. V pozdějším kurzu se dozvíte, jak používat ID
, aniž classname
byste usnadnili implementaci dědičnosti v datovém modelu.
Vlastnost Grade
je výčt. Otazník za Grade
deklaraci typu označuje, že Grade
vlastnost je nullable. Známka, která má hodnotu null, se liší od nulové známky – hodnota 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 tato vlastnost může obsahovat pouze jednu Student
entitu (na rozdíl od Student.Enrollments
vlastnosti navigace, kterou jste viděli dříve, což 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 <vlastnosti navigace název><vlastnosti> primárního klíče (například StudentID
pro Student
navigační vlastnost, protože Student
primární klíč entity jeID
). Vlastnosti cizího klíče lze také pojmenovat stejně jako <název> vlastnosti primárního klíče (například vzhledem k tomu, CourseID
že Course
primární klíč entity je CourseID
).
Entita Course
Ve složce Models 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 této série. Tento atribut v podstatě umožňuje zadat primární klíč pro kurz, nikoli databázi vygenerovat.
Vytvoření kontextu databáze
Hlavní třída, která koordinuje funkce Entity Framework pro daný datový model, je třída kontextu databáze. Tuto třídu vytvoříte odvozením z System.Data.Entity.DbContext třídy. V kódu určíte, které entity jsou součástí datového modelu. Můžete také přizpůsobit určité chování entity Framework. V tomto projektu má třída název SchoolContext
.
Chcete-li vytvořit složku v projektu ContosoUniversity, klikněte pravým tlačítkem myši na projekt v Průzkumník řešení a klepněte na tlačítko Přidat a potom klikněte na příkaz Nová složka. Pojmenujte novou složku DAL (pro vrstvu přístupu k datům). 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>(); } } }
Určení 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>
příkazy můžete vynechat DbSet<Enrollment>
a bude fungovat stejně. Entity Framework by je zahrnoval implicitně, protože entita Student
odkazuje na entitu Enrollment
a entitu Enrollment
odkazuje na entitu Course
.
Zadání připojovací řetězec
Název připojovací řetězec (který přidáte do souboru Web.config později) se předá konstruktoru.
public SchoolContext() : base("SchoolContext")
{
}
Můžete také předat samotný připojovací řetězec místo názvu souboru, který je uložen v souboru Web.config. Další informace o možnostech určení databáze, která se má použít, naleznete 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í řetězec je stejný jako název třídy. Výchozí název připojovací řetězec v tomto příkladu bude SchoolContext
stejný jako název, který explicitně zadáváte.
Zadání názvů tabulek s jednotným číslem
Příkaz modelBuilder.Conventions.Remove
v onModelCreating metoda zabraňuje názvům tabulek v množném čísle. Pokud jste to neudělali, vygenerované tabulky v databázi budou pojmenovány 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. Tento kurz používá jednotný tvar, ale důležitým bodem je, že můžete vybrat ten, který formulář dáváte přednost zahrnutím nebo vynecháním tohoto řádku kódu.
Inicializace databáze s testovacími daty
Entity Framework může při spuštění aplikace automaticky vytvořit databázi (nebo ji znovu vytvořit). Můžete určit, že by se to mělo 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, aby se naplnila testovacími daty.
Výchozí chování je vytvořit databázi pouze v případě, že neexistuje (a vyvolá výjimku, pokud se model změnil a databáze již existuje). V této části určíte, že by se databáze měla při každé změně modelu vyhodit a znovu vytvořit. 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 obvykle 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 změnit schéma databáze místo vyřazení 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ý způsobí vytvoření databáze v případě potřeby a načtení testovacích dat do nové databáze.
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 zde provedeno, 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 službě Entity Framework sdělit, aby používal třídu inicializátoru, přidejte do elementu
entityFramework
v souboru application Web.config (ten ve složce kořenového 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 nastavit atribut elementucontext
:disableDatabaseInitialization="true"
.) Další informace naleznete v tématu Nastavení konfiguračního souboru.Alternativou k nastavení inicializátoru v souboru Web.config je jeho použití v kódu přidáním
Database.SetInitializer
příkazu doApplication_Start
metody v souboru Global.asax.cs . Další informace naleznete 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 služba Entity Framework porovnávala databázi s modelem (třídy entit SchoolContext
). Pokud je nějaký rozdíl, aplikace databázi zahodí a znovu vytvoří.
Poznámka:
Když nasadíte aplikaci na produkční webový server, musíte odebrat nebo zakázat kód, který zahodí a znovu vytvoří databázi. Uděláte to v pozdějším kurzu této série.
Nastavení EF 6 pro použití LocalDB
LocalDB je zjednodušená verze databázového stroje SQL Server Express. Snadno se instaluje a konfiguruje, spouští 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 Serveru Express, který umožňuje pracovat s databázemi jako se soubory .mdf . Soubory databáze LocalDB můžete umístit do složky App_Data webového projektu, pokud chcete mít možnost zkopírovat databázi s projektem. Funkce instance uživatele v SQL Serveru Express také umožňuje pracovat s .mdf soubory, ale funkce instance uživatele je zastaralá. Proto se doporučuje pracovat s .mdf soubory LocalDB. Ve výchozím nastavení se v sadě Visual Studio nainstaluje LocalDB.
Sql Server Express se obvykle nepoužívá pro produkční webové aplikace. Místní databáze se nedoporučuje pro produkční použití 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 Web.config aplikace a přidejte
connectionStrings
prvek, který předchází elementuappSettings
, jak je znázorněno v následujícím příkladu. (Ujistěte se, že aktualizujete Soubor Web.config ve složce kořenového projektu. V podsložce Zobrazení je také soubor Web.config, 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řidaná připojovací řetězec 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 vytvořit databázi ve složce App_Data, můžete ji přidat AttachDBFilename=|DataDirectory|\ContosoUniversity1.mdf
do připojovací řetězec. Další informace o připojovací řetězec naleznete v tématu Připojovací řetězce SYSTÉMU SQL Server pro ASP.NET webové aplikace.
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 na základě vaší třídy kontextu. Další informace naleznete v tématu 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 model a třídy kontextu dostupné pro generování uživatelského rozhraní kontroleru MVC.
Klikněte pravým tlačítkem myši na složku Kontrolery v Průzkumník řešení, vyberte Přidat a potom klepněte na příkaz 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 Framework a pak zvolte Přidat.
V dialogovém okně Přidat kontroler proveďte následující výběry 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).
U ostatních polí ponechte výchozí hodnoty.
Když kliknete na Přidat, scaffolder vytvoří soubor StudentController.cs a sadu zobrazení (soubory .cshtml ), které pracují s kontrolerem. V budoucnu při vytváření projektů, které používají Entity Framework, můžete také využít některé další funkce správce: vytvoření první třídy modelu, nevytvářet připojovací řetězec a potom v poli Přidat kontroler zadat nový kontext dat výběrem + tlačítka vedle třídy kontextu dat. Scaffolder vytvoří vaši
DbContext
třídu a vaše připojovací řetězec a také kontroler a zobrazení.
Visual Studio otevře soubor Controllers\StudentController.cs . Vidí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ů z entity Students nastavenou č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 kombinace 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
. V závislosti na tom, jak zúžíte okno prohlížeče, uvidíte v horním panelu Adresa odkaz na kartu Student nebo budete muset kliknout na pravý horní roh, abyste odkaz viděli.
Zobrazení databáze
Když jste spustili stránku Students a aplikace se pokusila získat přístup k databázi, ef zjistil, že nebyla žádná databáze a vytvořila ji. EF pak spustil počáteční metodu pro naplnění databáze 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íka 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 položku School Context (ContosoUniversity) a potom 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 sloupce vytvořené a řádky vložené do tabulky.
Zavř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 se automaticky vytvoří tak, aby odpovídala vaší změně. Pokud například do předmětu Student
přidáte EmailAddress
vlastnost, spusťte znovu stránku Studenti a znovu se podívejte na tabulku, zobrazí se nový EmailAddress
sloupec.
Konvence
Množství kódu, který jste museli napsat, aby Entity Framework mohl vytvořit úplnou databázi za vás, je minimální kvůli konvencím nebo předpokladům, které Entity Framework dělá. Některé z nich již byly zaznamenány nebo byly použity, aniž byste o nich věděli:
- Tvary názvů tříd entit v množném čísle se používají jako názvy tabulek.
- Názvy vlastností entity se používají pro názvy sloupců.
- Vlastnosti entity s názvem
ID
nebo názvemID
třídy jsou rozpoznány jako vlastnosti primárního klíče. - Vlastnost je interpretována jako vlastnost cizího klíče, pokud se jmenuje název vlastnosti navigace název><vlastnosti> primárního klíče (například
StudentID
proStudent
navigační vlastnost, protožeStudent
primární klíč entity jeID
).< Vlastnosti cizího klíče lze také pojmenovat stejně jako <název> vlastnosti primárního klíče (například vzhledem k tomu,EnrollmentID
žeEnrollment
primární klíč entity jeEnrollmentID
).
Viděli jste, že konvence je možné přepsat. Zadali jste například, že názvy tabulek by neměly být v množném čísle a později se dozvíte, jak vlastnost explicitně označit 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 se naučíte:
- Vytvoření webové aplikace MVC
- Nastavení stylu webu
- Nainstalované Entity Framework 6
- Vytvoření datového modelu
- Vytvoření kontextu 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 kontrolovat a přizpůsobovat kód vytvoření, čtení, aktualizace, odstranění (CRUD) v řadičích a zobrazeních.