کاربران و همراهان عزیز حال شما خوبه ؟امیدوارم که روزخوبی را با شادی شروع کرده باشیدو  باارامش همراه ما  باشید تا اموزشی دیگر در زمینه  entity framework code first در mvc را داشته باشیم لازم به ذکر که در صورت نیاز به  قسمت اول

شروع با Entity Framework 6 Code First با استفاده از MVC5 قسمت دوم

ایجاد کانتکست دیتابیس

گروه اصلی که عملکرد Entity Framework را برای یک مدل داده ی ارائه شده هماهنگ می کند، گروه database context می باشد. شما می توانید این گروه را با استخراج از System.Data.Entity.DbContextایجاد کنید. شما در کد خود مشخص می کنید که کدام ماهیت ها در مدل داده وارد می شوند. همچنین می توانید رفتار یک Entity Framework را به دلخواه خود تنظیم کنید. در این پروژه گروه SchoolContext نامیده می شود.

برای ایجاد یک فولدر در پروژه ی ContosoUniversity، روی Solution Explorer راست کلیک کرده و Add را کلیک کنید و سپس New Folder را کلیک کنید. فولدر جدید را با عنوانDAL (مخفف Data Access Layer) نامگذاری کنید. در آن فولدر گروه جدیدی به نام SchoolContext.cs ایجاد کرده و کد زیر را جایگزین کد الگو کنید.

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 Students { get; set; }‎
‎ public DbSet Enrollments { get; set; }‎
‎ public DbSet Courses { get; set; }‎
‎ protected override void OnModelCreating(DbModelBuilder ‎modelBuilder)‎
‎ {‎
‎ modelBuilder.Conventions.Remove();‎
‎ }‎
‎ }‎
‎}‎

مشخص کردن مجموعه های ماهیت

این کد یک پراپرتی DbSet برای هر مجموعه ماهیت ایجاد می کند. در پایانه ی Entity Framework یک entity set عموما با یک جدول دیتابیس و یک entity با یک ردیف در جدول، منطبق می شود.

شما می توانستید عبارات DbSet و DbSet را حذف کنید که این نیز همان کار را انجام می دهد.Entity Framework آنها را به طور ضمنی وارد می کند، زیرا ماهیت Student به ماهیت Enrollment ارجاع می شود و ماهیت Enrollment نیز به ماهیت Coursee.

مشخص کردن رشته ی اتصال

نام رشته ی اتصال (که بعدها به فایلWeb.config اضافه خواهید کرد) به سازنده منتقل می شود.

public SchoolContext() : base(“SchoolContext”)‎
‎{‎
‎}‎

شما می توانستید این انتقال را در خود رشته ی اتصال نیز انجام دهید که در فایلWeb.config ذخیره شده است. برای اطلاعات بیشتر در مورد گزینه هایی برای تعیین استفاده ی دیتابیسEntity Framework – Connections and Models را بررسی کنید. اگر شما یک رشته ی اتصال یا نام آن را به طور ضمنی مشخص نکنید، Entity Framework می پذیرد که نام رشته ی اتصال همان نام گروه می باشد. بنابراین نام رشته ی اتصال پیش فرض در این مثال SchoolContext می باشد، همان چیزی که به طور واضح مشخص کرده اید.

مشخص کردن نام های جدول مفرد

عبارت modelBuilder.Conventions.Remove در روشOnModelCreating از جمع بسته شدن نام جدول ها جلوگیری می کند. اگر این کار را انجام ندادید، نام های جدول تولید شده در دیتابیس Students، Coursesو Enrollments خواهد بود. در عوض نام های جدول Student و Course و Enrollment خواهند بود. توسعه دهندگان در مورد این امر که نام های جدول باید جمع باشد یا نه مخالف هستند. این آموزش از فرم مفرد استفاده می کند، اما نکته ی مهم این است که با اضافه کردن یا حذف این خط از کد، شما می توانید فرم مورد نظر خود را انتخاب کنید.

برقراری EF برای آغاز دیتابیس با تست داده

Entity Framework می تواند در هنگام اجرای برنامه به طور خودکار برای شما یک دیتابیس ایجاد کند. شما می توانید تعیین کنید که این کار در هر زمان که برنامه اجرا می شود، انجام شود یا فقط زمانیکه با دیتابیس موجود مدل خارج ازsync می باشد. همچنین می توانید یک روش Seed بنویسید که Entity Framework بعد از ایجاد دیتابیس، برای قرار دادن تست داده در آن، روش را به طور خودکار فرا بخواند. رفتار پیش فرض ایجاد یک دیتابیس می باشد، فقط زمانی که وجود ندارد(برقرای یک اکسپشن اگر دیتابیس وجود دارد و مدل تغییر کرده است). در این بخش تعیین می کنید که هروقت مدل تغییر می کند، دیتابیس حذف شده و دوباره ایجاد می شود. حذف دیتابیس باعث ازبین رفتن همه ی داده های شما می شود. این امر در طی امر توسعه خوب می باشد، زیرا روشSeed هروقت دیتابیس دوباره ایجاد می شود، اجرا خواهد شد و تست داده ی شما را دوباره ایجاد خواهد کرد. اما به طور کل در محصول نمی خواهید هر زمان که در نمودار دیتابیس تغییر ایجاد کردید، همه ی داده ی خود را از دست بدهید. بعدها مشاهده خواهید کرد که چگونه با استفاده از Code First Migrations به تغییرات مدل رسیدگی کنید تا به جای حذف و ایجاد مجدد دیتابیس، نمودار دیتابیس را تغییر دهید. در پوشه ی 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 : ‎System.Data.Entity.DropCreateDatabaseIfModelChanges
‎ {‎
‎ protected override void Seed(SchoolContext context)‎
‎ {‎
‎ var students = new List
‎ {‎
‎ 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.Pars‎e(“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
‎ {‎
‎ 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
‎ {‎
‎ 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();‎
‎ }‎
‎ }‎
‎}‎

روش Seed آبجکت کانتکست دیتابیس را به عنوان یک پارامتر ورودی می گیرد و کد در روش از آن آّبجکت برای افزودن ماهیت های جدید به دیتابیس استفاده می کند. این کد برای هر نوع ماهیت، مجموعه ی جدید از ماهیت ها ایجاد کرده و آنها را به پراپرتی مناسب DbSet اضافه می کند و سپس تغییرات را در دیتابیس ذخیره می کند. پس از هر گروه از ماهیت ها لازم به فراخوانی روش SaveChanges نمی باشد، همان طور که در اینجا انجام می شود، اما انجام این کار به شما کمک می کند تا منبع مشکل را تعیین کنید، اگر در هنگام نگارش کد در دیتابیس یک اکسپشن اتفاق بیفتد.

برای ایمکه به Entity Framework بگویید از گروه آغازگر شما استفاده کند، یک عنصر به عنصر entityFramework در برنامه ی فایلWeb.config (فایل در پوشه ی روت پروژه) اضافه کنید، همانطور که در مثال زیر نشان داده شده است.

‎<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>‎

context type نام گروه کانتکست مناسب و همگذاری که در آن است را تعیین می کند و databaseinitializer type نیز نام گروه آغازگر مناسب و هم گذاری که در آن است را تعیین می کند. (وقتی که نمی خواهید آغازگر از EF استفاده کند، می توانید یک عبارت روی عنصر context تنظیم کنید. disableDatabaseInitialization=”true” ) برای اطلاعات بیشتر Understanding Database Initializers in Entity Framework Code First را بررسی کنید.

اکنون وقتی برای اولین بار در اجرای برنامه، به دیتابیس دسترسی پیدا می کنید، برنامه به آن تنظیم می شود و Entity Framework دیتابیس را با مدل مقایسه می کند (SchoolContext و گروه های ماهیت). اگر تفاوتی وجود داشته باشد برنامه دیتابیس را حذف و دوباره ایجاد می کند.

نکته

وقتی که شما یک برنامه را به محصول سرور وب تنظیم می کنید، باید کدی را که دیتابیس را حذف و دوباره تولید می کند، غیرفعال کنید. این کار را در آموزش بعدی در این مجموعه فرا خواهید گرفت.

برقراری EF برای استفاده از یک دیتابیس SQL Server Express LocalDB

LocalDB یک ورژن کم اهمیت تر از SQL Server Express Database Engineمی باشد. نصب و تنظیم آغازها براساس تقاضا و اجرا به سبک کاربر آسان می باشد. LocalDB در سبک خاصی از اجرای SQL Server Express اجرا می شود که شما را قادر می شازد تا با دیتابیس ها به عنوان فایل های mdf کار کنید. اگر می خواهید توانایی کپی دیتابیس با پروژه را داشته باشید، می توانید فایل های دیتابیس LocalDB را در فولدر App_Data از یک پروژه ی وب قرار دهید. ویژگی نمونه ی کاربر درSQL Server Express نیز شما را قادر می سازد تا با فایل های .mdf کار کنید، اما این ویژگی طرد شده می باشد، بنابراین LocalDB برای کار با فایل های .mdf پیشنهاد می شود. در Visual Studio 2012 و ورژن های بعد از آن، LocalDB به طور پیش فرض با Visual Studio نصب شده است.

عموما SQL Server Express برای برنامه های وب محصول استفاده نمی شود. LocalDB برای استفاده ی برنامه ی وب با یک محصول توصیه نمی شود، زیرا برای کار با IIS طراحی نشده است. در این آموزش شما با LocalDB کار خواهید کرد. فایل برنامه ی Web.configرا باز کرده و یک عنصر connectionStrings به آن اضافه کنید که قبل از عنصر appSettingsقرار می گیرد، همانطور که در مثال زیر مشاهده می کنید.(مطمئن شوید که فایل Web.config در فولدر روت پروژه را آپدیت کرده اید. همچنین یک فایلWeb.config در فولدر زیرمجموعه ی Views وجود دارد که لازم نیست آپدیت شود)

‎<connectionstrings>

‎ <add name=”SchoolContext” connectionstring=”Data ‎Source=(LocalDb)\v11.0;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>‎

رشته ی اتصالی که اضافه گرده اید مشخص می کند که Entity Framework از یک دیتابیس LocalDB به نام ContosoUniversity1.mdf استفاده خواهد کرد.(دیتابیس هنوز وجود ندارد، EF آن راایجاد می کند.) اگر خواستید در فولدرApp_Data دیتابیس ایجاد شود، می توانید AttachDBFilename=|DataDirectory|\ContosoUniversity1.mdf را به رشته ی اتصال اضافه کنید. برای اطلاعات بیشتر در مورد رشته ی اتصال SQL Server Connection Strings for ASP.NET Web Applications را بررسی کنید.

در واقع لزومی ندارد که در فایلWeb.config رشته ی اتصال داشته باشید. اگر رشته ی اتصال ارائه ندهید، Entity Framework بر اساس کانتکست گروه شما از پیش فرض آن استفاده خواهد کرد. برای اطلاعات بیشتر را Code First to a New Database. بررسی کنید.

ایجاد یک کنترل کننده ی Student ویوها

اکنون شما برای نمایش داده صفحه ی وبی ایجاد خواهید کرد و فرایند درخواست داده به طور خودکار موجب ایجاد دیتابیس می شود. شما با ایجاد یک کنترل کننده شروع خواهید کرد، اما قبل از آن پروژه را بسازید تا مدل و گروه های کانتکست رت در دسترس کنترل کننده ی MVC قرار دهید.

۱٫ روی فولدر Controllers در Solution Explorer راست کلیک کرده و Add را انتاخب کنید روی New Scaffolded Item کلیک کنید.

۲٫ در دیالوگ باکس Add Scaffold، عبارت MVC 5 Controller with views، using Entity Framework را انتخاب کنید.

clip_image001[6]

۳٫ در دیالوگ باکس Add Controller انتخاب های زیر را انجام داده و سپس Add را کلیک کنید.

کلاس مدل: Student (ContosoUniversity.Models) (اگر این گزینه را در لیست رو به پایین نمی بینید، پروژه را ساخته و دوباره امتحان کنید.)

گروه دیتا کانتکست: SchoolContext (ContosoUniversity.DAL)

نام کنترل کننده: StudentController (نه StudentsController)

مقادیر پیش فرض را برای فیلدهای دیگر رها کنید.

clip_image002[6]

وقتی که روی Add کلیک می کنید Scaffolder یک فایل StudentController.cs و یک مجموعه از ویو ها ایجاد می کند که با کنترل کننده کار می کند. در آینده وقتی پروژهایی ایجاد کنید که Entity Framework استفاده می کنند، همچنین می توانید از عملکردهای اضافه ی scaffolder هم سود ببرید: فقط کافیست در ابتدا گروه مدل خود را ایجاد کنید، رشته ی اتصال ایجاد نکنید و سپس در باکس Add Controller گروه کاتکست جدید را مشخص کنید. Scaffolder گروه DbContext و رشته ی اتصال شما به همراه کنترل کننده و ویو ها ایجاد خواهد کرد.

۴٫ Visual Studio فایل Controllers\StudentController.cs را باز می کند. شما گروه متغیر را می بینید که ایجاد شده و یک آبجکت دیتابیس را به عنوان نمونه وارد کرده اند.

private SchoolContext db = new SchoolContext();‎

public ViewResult Index()‎

‎{‎

‎ return View(db.Students.ToList());‎

‎}‎

‎<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>

‎ }‎

۵٫ برای اجرای پروژه CTRL+F5 را فشار دهید.(اگر خطای “Cannot create Shadow Copy” را دریافت کردید، مرورگر را بسته و دوباره سعی کنید.)

روی Students کلیک کنید تا تست داده را که روش seed وارد کرده، مشاهده کنید. بسته به اینکه چقدر پنجره ی مرورگر شما بازیک است، لینک Student را در بالای نوار آدرس خواهید دید و یا اینکه باید گوشه ی سمت راست در بالای صفحه را کلیک کرده تا لینک را ببینید.

مشاهده ی دیتابیس

وقتی که شما صفحه ی Student را اجرا کردید، برنامه سعی کرد تا به دیتابیس دسترسی داشته باشد، EF متوجه شد که دیتابیس وجود ندارد، بنابراین آن را ایجاد کرد و سپس روشSeed را اجرا کرد تا داده ها را در دیتابیس قرار دهد.

شما می توانید از Server Explorer یا SQL Server Object Explorer (SSOX) برای مشاهده ی دیتابیس در Visual Studio استفاده کنید. برای این آموزش از Server Explorer استفاده خواهید کرد. (در ویرایش های قبل از ۲۰۱۳ Visual Studio Express عبارت Server Explorer ، نیز Database Explorer نامیده می شود)

۱٫ مرورگر را ببندید.

۲٫ در Server Explorer عبارات Data Connections و School Context (ContosoUniversity) و سپس Tables را باز کنید تا جدول را در دیتابیس جدید خود مشاهده کنید.

۳٫ روی جدول Student راست کلیک کرده و سپس Show Table Data را کلیک کنید تا ستون های ایجاد شده و ردیف های وارد شده در جدول را ببینید.

۴٫ اتصال Server Explorer را ببندید.

فایل های دیتابیس ContosoUniversity1.mdf and .ldf در فولدر C:\Users\می باشند.

از آنجایی که در حال حاضر در حال استفاده از آغازگرDropCreateDatabaseIfModelChanges می باشید، می توانید در گروه Student تغییراتی ایجاد کنید و برنامه را دوباره اجرا کنید، دیتابیس نیز برای هماهنگی با تغییرات شما دوباره ایجاد خواهد شد. به عنوان مثال اگر پراپرتی EmailAddress را به گروه Student اضافه کنید، صفحه ی Students را دوباره اجرا کرده و سپس مجددا به جدول نگاه کنید، شما یک ردیف EmailAddress جدید خواهید دید.

مقدار کدی که باید بنویسید تا Entity Framework قادر باشد یک دیتابیس کامل برای شما ایجاد کند، به خاطر استفاده از conventions یا فرضیه هایی که Entity Framework می سازد، حداقل می باشد. برخی از آنها تقریبا ذکر شده اند یا بدون آگاهی شما مورد استفاده قرار گرفته اند.

فرم های جمع از نام های گروه ماهیت با عنوان نام های جدول استفاده می شوند.

نام های پراپرتی ماهیت برای نام های ستون استفاده می شوند.

پراپرتی های ماهیت کهID یا classnameID نامیده می شوند، به عنوان پراپرتی های اصلی اولیه تشخیص داده می شوند. اگر نام یک پراپرتی باشد، به عنوان پراپرتی کلید خارجی در نظر گرفته می شود (به عنوان مثال StudentID برای پراپرتی مسیریابی Student زیرا کلید اولیه ی ماهیت Student، ID می باشد.( پراپرتی های کلید خارجی نیز می توانند به همان روش نامگذاری شوند.(به عنوان مثال EnrollmentID، زیرا کلید اولیه ی ماهیت Enrollment، EnrollmentID می باشد.)

مشاهده کردید که convention ها می توانند تحت الشعاع قرار بگیرند. برای مثال مشخص کردید که نام های جدول نباید جمع بسته شوند و بعدها مشاهده خواهید کرد که چگونه یک پراپرتی را تبدیل به یک پراپرتی کلید خارجی کنید. در مورد convention ها در Creating a More Complex Data Model بیشتر خواهید آموخت. برای اطلاعات بیشتر در مورد convention ها Code First Conventions را بررسی کنید.

خلاصه

اکنون یک برنامه ی ساده ایجاد کرده اید که از Entity Framework و SQL Server Express LocalDB برای ذخیره سازی و نمایش داده استفاده می کند. در بخش بعدی فراخواهید گرفت که چگونه عملکردهای CRUD پایه (ایجاد، خواندن، آپدیت کردن و حذف کردن) را اجرا کنید.