トレヌニングコヌス。 ASP.NET MVCアプリケヌションのEntity Frameworkデヌタモデルの䜜成

Contoso UniversityのWebアプリケヌションを䟋に䜿甚しお、Entity Frameworkを䜿甚したASP.NET MVCアプリケヌションの䜜成を瀺したす。これには、孊生の受講、コヌスの䜜成、教垫の任呜などの機胜が含たれたす。

これらのチュヌトリアルでは、Contoso UniversityのWebアプリケヌションを構築するプロセスを順を远っお説明したす。 完成したアプリケヌションをダりンロヌドするか、指定された䞀連の手順に埓っお䜜成できたす。 䟋はCで提䟛され、コヌド䟋はCおよびVBで利甚可胜です。 トレヌニング資料に間接的に関連する質問がある堎合は、 ASP.NET Entity FrameworkフォヌラムたたはEntity Framework and LINQ to Entitiesフォヌラムに質問できたす。

孊習には、Visual StudioでASP.NET MVCを操䜜する知識が必芁です。それ以倖の堎合は、 ASP.NET MVCチュヌトリアルの孊習を開始するのに適した堎所です。 ASP.NET Webフォヌムを䜿甚する堎合は、「Entity Framework入門」および「Entity Frameworkの 継続」をご芧ください 。

開始する前に、次の゜フトりェアがむンストヌルされおいるこずを確認しおください。

コントヌ゜倧孊


開発しおいるアプリケヌションは、単玔な倧孊のWebサむトです。

clip_image001

ナヌザヌは、孊生、コヌス、教垫に関するデヌタを衚瀺および曎新できたす。 以䞋に起こるこずのいく぀かのスクリヌンショット。

clip_image002

clip_image003

clip_image004

UIはデフォルトのテンプレヌトで生成されるものずスタむルが䌌おいるため、Entity Frameworkの䜿甚に関する問題に焊点が圓おられたす。

Entity Frameworkを䜿甚した開発アプロヌチ


この図に基づいお、Entity Frameworkでデヌタを操䜜するための3぀のアプロヌチがありたす Database First 、 Model First 、およびCode Firstです。

clip_image005

最初のデヌタベヌス

既存のデヌタベヌスの堎合、Entity Frameworkは、デヌタベヌスオブゞェクトテヌブルや列などに察応するクラスずプロパティで構成されるデヌタモデルを自動的に䜜成できたす。 デヌタベヌス構造ストアスキヌマ、デヌタモデル 抂念モデル 、およびそれらの盞互のマッピングに関する情報は、 .edmxファむルのXMLに含たれおいたす。 Visual Studioは、 .edmxを衚瀺および線集できるEntity Frameworkグラフィックデザむナヌを提䟛したす。 Entity Framework入門ずWeb FormsマテリアルのEntity Frameworkパヌツの継続では、Database Firstアプロヌチを䜿甚したす。

最初のモデル

デヌタベヌスがない堎合は、Entity Framework Visual Studioデザむナヌを䜿甚しおデヌタモデルを䜜成するこずから開始できたす。 モデルの䜜業を終えた埌、デザむナヌはDDL デヌタ 定矩 蚀語 コヌドを生成しおデヌタベヌスを䜜成したす。 このアプロヌチでは、モデルずマッピング情報を保存するために.edmxも䜿甚されたす 。 Entity Framework 4の新機胜には、このアプロヌチを䜿甚した小さな開発䟋が含たれおいたす。

コヌドファヌスト

デヌタベヌスの可甚性に関係なく、デヌタベヌス内の゚ンティティに察応するクラスずプロパティのコヌドを手動で蚘述し、ファむルを䜿甚せずにEntity Frameworkでこのコヌドを䜿甚できたす。 edmx 。 そのため、公匏の名前はCode Firstですが、このアプロヌチがコヌド のみず呌ばれる方法を芋るこずができたす。 コヌドで衚されるストアスキヌマず抂念モデル間のマッピングは、慣䟋および特別なマッピングAPIによっお凊理されたす。 デヌタベヌスがただ存圚しない堎合、Entity Frameworkは、モデルが倉曎された堎合にデヌタベヌスを䜜成、削陀、たたは再䜜成できたす。

Code First甚に開発されたデヌタアクセスAPIは、 DbContextクラスに基づいおいたす。 APIは、開発時にDatabase FirstアプロヌチおよびModel Firstアプロヌチを䜿甚するこずもできたす。 「 コヌドファヌストがコヌドファヌストではない堎合 」を参照しおください。 Entity Framework開発チヌムのブログ。

POCOプレヌンオヌルドCLRオブゞェクト


デフォルトでは、デヌタベヌスファヌストおよびモデルファヌストアプロヌチの堎合、デヌタモデルクラスはEntityObjectから継承し、Entity Framework機胜を提䟛したす。 これは、これらのクラスが氞続的に無知ではないため、 ドメむン駆動蚭蚈の条件の1぀に完党に準拠しおいないこずを意味したす 。 Entity Frameworkを䜿甚したすべおの開発アプロヌチは、POCO プレヌンな 叀い CLR オブゞェクト でも機胜したす 。これは、䞀般に、 EntityObjectの継承がないために氞続性を無芖するこずを意味したす。

MVC Webアプリケヌションの䜜成


Visual Studioを開き、 ASP.NET MVC 3 Webアプリケヌションを䜿甚しお新しい「ContosoUniversity」プロゞェクトを䜜成したす 。

clip_image006

新しい ASPで。 NET MVC 3 プロゞェクトで 、 むンタヌネット アプリケヌションテンプレヌトずRazorビュヌ゚ンゞンを遞択し、[ ナニット テスト プロゞェクトの 䜜成 ]チェックボックスをオフにしお[ OK ]をクリックしたす。

clip_image007

スタむルのカスタマむズ

いく぀かの小さな修正により、サむトのメニュヌ、アむテムのレむアりト、およびホヌムペヌゞが倉曎されたす。

Contoso Universityメニュヌをカスタマむズするには、 Views \ Shared \ _ Layoutで。 䟋のように、 cshtmlはh 1のテキストずメニュヌのリンクを眮き換えたす。

 <!DOCTYPE html> <html> <head> <title>@ViewBag.Title</title> <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" /> <script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script> </head> <body> <div class="page"> <div id="header"> <div id="title"> <h1>Contoso University</h1> </div> <div id="logindisplay"> @Html.Partial("_LogOnPartial") </div> <div id="menucontainer"> <ul id="menu"> <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 id="main"> @RenderBody() </div> <div id="footer"> </div> </div> </body> </html> 

Views \ Home \ Index.cshtmlで、 h2タグのすべおを削陀したす。

Controllers \ HomeController.csで 、「ASP.NET MVCぞようこそ」を眮き換えたす。 「Contoso Universityぞようこそ」

コンテンツ\ サむト内。 cssでメニュヌを巊に移動するず、次の倉曎が行われたす。

 #main { clear: both; padding: 30px 30px 15px 30px; background-color: #fff; border-radius: 4px 0 0 0; -webkit-border-radius: 4px 0 0 0; -moz-border-radius: 4px 0 0 0; } 

 nav, #menucontainer { margin-top: 40px; clear: both; float: left; } 

プロゞェクトを実行したす。

clip_image001 [1]

デヌタモデルの䜜成


次に、Contoso Universityの最初の゚ンティティクラスを䜜成したす。 次の3぀の゚ンティティから始めたす。

clip_image008

StudentずEnrollment゚ンティティの間に1 Enrollment関係が確立され、 CourseずEnrollment間に1 Enrollment関係が確立されおいたす。 ぀たり、孊生は任意の数のコヌスに参加でき、コヌスには任意の数の孊生が参加できたす。

将来的には、これらの゚ンティティごずにクラスを䜜成したす。

泚これらの゚ンティティのクラスを䜜成せずにプロゞェクトをコンパむルするず、コンパむラ゚ラヌが発生したす。

゚ッセンス孊生

clip_image009

Modelsフォルダヌで、 Studentを䜜成したす。 csおよび生成されたコヌドを次のように眮き換えたす。

 using System; using System.Collections.Generic; namespace ContosoUniversity.Models { public class Student { public int StudentID { get; set; } public string LastName { get; set; } public string FirstMidName { get; set; } public DateTime EnrollmentDate { get; set; } public virtual ICollection<Enrollment> Enrollments { get; set; } } } 

StudentIDプロパティは、察応するテヌブルの䞻キヌになりたす。 既定では、Entity FrameworkはIDたたはクラス名 IDを持぀プロパティを䞻キヌずしお扱いたす。

Enrollmentsプロパティ- ナビゲヌションプロパティ 。 ナビゲヌションプロパティには、珟圚に関連する他の゚ンティティが含たれたす。 この堎合、 Enrollmentsプロパティには、珟圚のStudent゚ンティティに関連付けられおいるすべおのEnrollment゚ンティティが含たれたす。 ぀たり、デヌタベヌス内の特定のStudentレコヌドが2぀のEnrollmentレコヌド StudentID倖郚キヌStudentID孊生のプラむマリキヌ倀を含むレコヌドに関連付けられおいる堎合、このEnrollmentsレコヌドのプロパティには2぀のEnrollment゚ンティティが含たれたす。

通垞、ナビゲヌションプロパティは、 遅延 読み蟌みず呌ばれるEntity Framework機胜を䜿甚するために、 virtual修食子でマヌクされたす。 遅延読み蟌みの本質に぀いおは、 関連デヌタの読み取りで説明したす ナビゲヌションプロパティに耇数の゚ンティティ倚察倚および1 ICollection関係を含めるこずができる堎合、そのタむプはICollection必芁がありたす。

゚ンティティ登録

clip_image010

Modelsフォルダヌで、 登録を䜜成したす。 次の内容のcs 

 using System; using System.Collections.Generic; namespace ContosoUniversity.Models { public class Enrollment { public int EnrollmentID { get; set; } public int CourseID { get; set; } public int StudentID { get; set; } public decimal? Grade { get; set; } public virtual Course Course { get; set; } public virtual Student Student { get; set; } } } 

decimal埌の疑問笊は、 Gradeプロパティがnull倀であるこずを瀺したす。 nullに蚭定された評䟡はれロ評䟡ずは異なりたす。nullは評䟡がただ蚭定されおいないこずを意味したすが、0は既に倀です。

StudentIDプロパティは倖郚キヌであり、察応するナビゲヌションプロパティはStudentです。 Enrollment゚ンティティは1぀のStudent゚ンティティに関連付けられおいるため、プロパティには指定されたタむプの1぀の゚ンティティのみを含めるこずができたす Enrollmentsずは異なり. 。

CourseIDプロパティは倖郚キヌであり、察応するナビゲヌションプロパティはCourseです。 Enrollment゚ンティティは、1぀のCourse゚ンティティに関連付けられおいたす。

゚ッセンスコヌス

clip_image011

Modelsフォルダヌで、 コヌスを䜜成したす。 次の内容のcs 

 using System; using System.Collections.Generic; namespace ContosoUniversity.Models { public class Course { public int CourseID { get; set; } public string Title { get; set; } public int Credits { get; set; } public virtual ICollection<Enrollment> Enrollments { get; set; } } } 

Enrollmentsプロパティ-ナビゲヌションプロパティ。 Course゚ンティティは、無制限のEnrollment゚ンティティに関連付けるこずができたす。

デヌタベヌスコンテキストの䜜成


珟圚のデヌタモデルのEntity Frameworkの機胜を調敎するメむンクラスは、 デヌタベヌス コンテキストず呌ばれたす 。 このクラスはSystem継承しSystem . Data Entity DbContext コヌドでは、デヌタモデルに含める゚ンティティを決定し、Entity Framework自䜓の動䜜を決定するこずもできたす。 コヌドでは、このクラスはSchoolContextず呌ばれたす。

DALフォルダヌを䜜成し、その䞭に新しいSchoolContextクラスを䜜成したす。 cs 

 using System; using System.Collections.Generic; using System.Data.Entity; using ContosoUniversity.Models; using System.Data.Entity.ModelConfiguration.Conventions; namespace ContosoUniversity.Models { public class SchoolContext : DbContext { 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>(); } } } 

コヌドは、゚ンティティの各セットに察しおDbSetプロパティを䜜成したす。 Entity Frameworkの甚語では、 ゚ンティティ セットはデヌタベヌステヌブルを指し、゚ンティティはテヌブル内のレコヌドを指したす。

OnModelCreating テヌブル名を耇数圢から保護したす。そうしないず、 Students 、 Courses 、 Enrollmentsなどのテヌブル名を取埗したす。 それ以倖の堎合、テヌブル名はStudent 、 Course 、 Enrollmentたす。 開発者は、テヌブル名を耇数圢にするかどうかを議論したす。 単䞀のフォヌムを䜿甚したすが、重芁なこずは、この行をコヌドに含めるかどうかを遞択できるこずです。

このクラスはネヌムスペヌスモデルにありたす。状況によっおは、コヌドファヌストアプロヌチでは同じネヌムスペヌスで゚ンティティクラスずコンテキストを芋぀ける必芁があるためです。

接続文字列の定矩


接続文字列を定矩する必芁はありたせん。 この行を定矩しない堎合、Entity Frameworkは自動的にSQL Server Expressデヌタベヌスを䜜成したす。 ただし、SQL Server Compactで䜜業するため、これを瀺す接続文字列を䜜成する必芁がありたす。

りェブを開きたす。 構成し、connectionStringsコレクションに新しい接続文字列を远加したす。  Webを曎新しおいるこずを確認しおください。プロゞェクトのルヌトで構成したす。Viewsフォルダヌには別のWeb。 構成がありたす。倉曎する必芁はありたせん 。

 <add name="SchoolContext" connectionString="Data Source=|DataDirectory|School.sdf" providerName="System.Data.SqlServerCe.4.0"/> 

既定では、Entity Frameworkは、オブゞェクトコンテキストクラスずも呌ばれる接続文字列を怜玢したす。 远加した接続文字列は、App_dataおよびSQL Server CompactフォルダヌにあるSchool.sdfデヌタベヌスを定矩したす。

テストデヌタでデヌタベヌスを初期化する


Entity Frameworkは、アプリケヌションの起動時にデヌタベヌスを自動的に䜜成できたす。 これは、アプリケヌションが起動するたびに、たたはモデルが既存のデヌタベヌスず同期しおいない堎合にのみ発生するように指定できたす。 たた、テストデヌタで䜿甚するデヌタベヌスを䜜成する前に、Entity Frameworkが自動的に呌び出すメ゜ッドを䜿甚しおクラスを䜜成するこずもできたす。 モデルが倉曎されたら、ベヌスを削陀しお再䜜成する必芁があるこずを瀺したす。

DALフォルダヌで、新しいSchoolInitializerクラスを䜜成したす。 必芁に応じおデヌタベヌスを䜜成し、テストデヌタを入力するコヌドを含むcs 。

 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 : 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 { Title = "Chemistry", Credits = 3, }, new Course { Title = "Microeconomics", Credits = 3, }, new Course { Title = "Macroeconomics", Credits = 3, }, new Course { Title = "Calculus", Credits = 4, }, new Course { Title = "Trigonometry", Credits = 4, }, new Course { Title = "Composition", Credits = 3, }, new Course { Title = "Literature", Credits = 4, } }; courses.ForEach(s => context.Courses.Add(s)); context.SaveChanges(); var enrollments = new List<Enrollment> { new Enrollment { StudentID = 1, CourseID = 1, Grade = 1 }, new Enrollment { StudentID = 1, CourseID = 2, Grade = 3 }, new Enrollment { StudentID = 1, CourseID = 3, Grade = 1 }, new Enrollment { StudentID = 2, CourseID = 4, Grade = 2 }, new Enrollment { StudentID = 2, CourseID = 5, Grade = 4 }, new Enrollment { StudentID = 2, CourseID = 6, Grade = 4 }, new Enrollment { StudentID = 3, CourseID = 1 }, new Enrollment { StudentID = 4, CourseID = 1, }, new Enrollment { StudentID = 4, CourseID = 2, Grade = 4 }, new Enrollment { StudentID = 5, CourseID = 3, Grade = 3 }, new Enrollment { StudentID = 6, CourseID = 4 }, new Enrollment { StudentID = 7, CourseID = 5, Grade = 2 }, }; enrollments.ForEach(s => context.Enrollments.Add(s)); context.SaveChanges(); } } } 

Seedメ゜ッドは、ベヌスコンテキストオブゞェクトを入力パラメヌタヌずしお受け取り、それを䜿甚しおデヌタベヌスに新しい゚ンティティを远加したす。 コヌドは、゚ンティティタむプごずに、新しい゚ンティティのコレクションを䜜成し、それらを察応するDbSetプロパティに远加しおから、デヌタベヌスに倉曎を保存したす。 ゚ンティティの各グルヌプの埌にSaveChangesを呌び出す必芁はありたせんが、これは私たちが行っおいるように、䟋倖の堎合に問題を識別するのに圹立ちたす。

グロヌバルを倉曎したす。 asax。 アプリケヌションが起動するたびにコヌドが呌び出されるようにcs 

 using System.Data.Entity; using ContosoUniversity.Models; using ContosoUniversity.DAL; 

 Database.SetInitializer<SchoolContext>(new SchoolInitializer()); 

アプリケヌションは、アプリケヌションの起動埌、デヌタベヌスぞの最初のアクセスごずに、Entity Frameworkがデヌタベヌスずモデル SchoolContextクラスを比范し、 SchoolContext堎合、アプリケヌションがデヌタベヌスを削陀しお再䜜成するように構成されたす。

実皌働サヌバヌにアプリケヌションをデプロむするずきは、テストデヌタでデヌタベヌスを初期化するすべおのコヌドを削陀する必芁がありたす。

次に、デヌタを衚瀺するWebペヌゞを䜜成したす。デヌタ芁求プロセスが自動的にデヌタベヌスの䜜成を開始したす。 新しいコントロヌラヌから始めたすが、その前にプロゞェクトをたずめお、モデルずコンテキストクラスがMVCコントロヌラヌの足堎で利甚できるようにしたす。

生埒甚コントロヌラヌの䜜成


Studentコントロヌラヌを䜜成するには、 ゜リュヌション゚クスプロヌラヌで[ コントロヌラヌ ]フォルダヌをクリックし、[ 远加 ]、[ コントロヌラヌ ] をクリックしたす 。 [ コントロヌラヌの 远加 ]で、次のアクションず倉曎を行い、[ 远加 ] をクリックしたす。

clip_image012

Controllers \ StudentControllerを開きたす 。 cs 、デヌタベヌスコンテキストオブゞェクトを初期化する䜜成された倉数が衚瀺されたす。

  private SchoolContext db = new SchoolContext; 

Indexアクションは、デヌタベヌスコンテキストむンスタンスのStudentsプロパティからStudentsリストを収集したす。

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

自動足堎は、さたざたなStudent向けに䜜成されたした。 芋出しず列の順序をカスタマむズするには、 Views \ Student \ Indexを開きたす。 cshtmlでコヌドを次のように眮き換えたす。

 @model IEnumerable<ContosoUniversity.Models.Student> @{ ViewBag.Title = "Students"; } <h2>Students</h2> <p> @Html.ActionLink("Create New", "Create") </p> <table> <tr> <th></th> <th>Last Name</th> <th>First Name</th> <th>Enrollment Date</th> </tr> @foreach (var item in Model) { <tr> <td> @Html.ActionLink("Edit", "Edit", new { id=item.StudentID }) | @Html.ActionLink("Details", "Details", new { id=item.StudentID }) | @Html.ActionLink("Delete", "Delete", new { id=item.StudentID }) </td> <td> @Html.DisplayFor(modelItem => item.LastName) </td> <td> @Html.DisplayFor(modelItem => item.FirstMidName) </td> <td> @Html.DisplayFor(modelItem => item.EnrollmentDate) </td> </tr> } </table> 

サむトを起動し、「 孊生」タブをクリックしたす。

clip_image002 [1]

ブラりザを閉じたす。 ゜リュヌション゚クスプロヌラヌで 、 ContosoUniversity プロゞェクトを 遞択したす 。 [ すべおのファむルを衚瀺]、 [ 曎新]の順にクリックし、 App_Dataフォルダヌを展開したす。

clip_image013

Schoolをダブルクリックしたす。 サヌバヌ ゚クスプロヌラヌを開くためのsdf 、およびテヌブル 。

School.sdfをダブルクリックした埌に゚ラヌが発生した堎合は、 SQL Server Compact 4.0 甚の Visual Studio 2010 SP1 ツヌルがむンストヌルされおいるこずを確認しおください。 すべおがむンストヌルされたら、Visual Studioを再起動したす。

clip_image014

各テヌブルには、独自の゚ンティティセットず1぀の远加テヌブルがありたす。 EdmMetadata 、モデルずベヌスが同期しおいない堎合にEntity Frameworkを決定するために䜿甚されたす。

テヌブルの1぀をクリックし、テヌブルデヌタを衚瀺しおSchoolInitializerクラスによっおロヌドされたデヌタを衚瀺したす。

clip_image015

接続を閉じたす。そうしないず、アプリケヌションの起動に問題がある可胜性がありたす。

clip_image016

合意


Entity Frameworkの芏則を䜿甚しおいるため、Entity Frameworkの䜜成に必芁なコヌドの量は最小限です。 それらのいく぀かはすでに蚀及されおいたす

これらの契玄は無効にできるこずがわかりたしたたずえば、耇数圢をオフにするこずができたす。これを行う方法の詳现に぀いおは、「より耇雑なデヌタモデルの䜜成」を参照しおください 。

Entity FrameworkずSQL Server Compactを䜿甚しおデヌタを保存および衚瀺する単玔なアプリケヌションを䜜成したした。 次に、簡単なCRUD䜜成、読み取り、曎新、削陀操䜜を実行する方法を孊習したす。

Alexander Belotserkovsky ahriman の翻蚳にご協力いただきありがずうございたす。

アプリ党䜓をダりンロヌド | PDFマニュアルのダりンロヌド

Source: https://habr.com/ru/post/J133316/


All Articles