PDA

View Full Version : آموزش: آموزش Entity Framework 6 Code First به کمک MVC.Net



farjadp
جمعه 14 فروردین 1394, 21:23 عصر
پیشنهاد می کنم مقاله را از سایت و این ادرس (http://www.vaniait.com/category/programming/) بخوانید. زیرا در سایت از آیکن و عکس ها استفاده کردم که در اینجا محدودیت کپی/پیست وجود دارد

http://www.vaniait.com/wp-content/uploads/2015/04/entity-framework-6-code-first-aid-training-mvc-net-introduction-vaniait.jpg
















همانگونه که در کتاب آموزش قبلی یعنی «شروع کار با MVC 5 (http://www.vaniait.com/goto/http://www.farjadp.com/%d8%a2%d9%85%d9%88%d8%b2%d8%b4-asp-net-mvc-5-%d8%a8%d9%87-%d8%b2%d8%a8%d8%a7%d9%86-%d8%b3%d8%a7%d8%af%d9%87/)» قول داده بودم ، آموزش Entity Framework 6 Code First به کمک MVC.Net را به مرور در سایت شرکت طراحی وبسایت وانیا قرار خواهم داد. در این مباحث شما را با مفاهیم پایه ای Entity Framework آشنا خواهم کرد و همزمان نیز پروژه ای را شروع و به پایان می رسانیم. این نوشتارها و آموزش ها بر اساس دو کتاب زیر می باشد : کتاب Getting Started with Entity Framework 6 Code First using MVC 5 انتشارات Microsoft Technology کتاب Programming Entity Framework Code First انتشارات O’REILLYدوستانی که برای بار اول است با نوشتارهای بنده روبرو می شوند باید عرض کنم که بنده (مرتضی پورمحمد (http://www.vaniait.com/goto/http://www.mortezap.ir/)) این کتاب ها را به زبان محاوره ای ترجمه و تجربیات شخصی را نیز در آنها دخلی می کنم و برخلاف دیگر دوستان مترجم و دانشمند! تنها به ترجمه ی صِرف بسنده نمی کنم. پس اگر جایی از نوشتارهایم برخلاف گفته ها و یا فصول کتاب/ها است، به همین علت می باشد.و اما پروژه ای که در این مسیر با کمک شما آن را به نتیجه می رسانیم «دانشگاه آموزشی وانیا» می باشد که در کتاب Getting Started with Entity Framework 6 Code First using MVC 5 تحت عنوان « Contoso University » معرفی شده است. پروژه ی فوق را توسط تکنولوژی های زیر پیگیری خواهیم کرد

Visual Studio 2014 Update 4
Net 4.5
Entity Framework 6 (EntityFramework 6.1.3 NuGet package (http://www.vaniait.com/goto/https://www.nuget.org/packages/EntityFramework))

همچنین پیشنهاد می کنم قبل از شروع این مباحث ، آشنایی اندکی با مباحث زیر داشته باشید

HTML / CSS / JQuery
C#
MVC.Net 5

در صورت داشتن هرگونه سوال و یا نظر نیز می توانید از طریق راه های ارتباطی زیر در تماس باشید:

تلفن شرکت : ۰۲۱۶۶۳۵۹۸۹۸
تلفن همراه : ۰۹۱۲۲۸۳۰۷۹۵
پست الکترونیک : manager [at] vaniait [dot] com
کامنت زیر هر مقاله

و اما شروع. برای شروع باید به ادبیات مشترکی با یکدیگر برسیم تا زبان همدیگر را بهتر بفهمیم. ORM چیست ؟قبل از این که بخواهیم باEntity Frameworkآشنا شویم، بهتر است مفهومORMرا بدانیم.ORMیا Object Relational Mappingابزاری است که به وسیله آن می توان جداول پایگاه داده را پردازش کرد و آنها را به فرمت شیءنگاشت کرد که در کدنویسی خواناتر باشند. در کدنویسی به جای این که به صورت مستقیم با جداول پایگاه داده کار کنیم بر روی اشیاء کار می کنیم. به این اشیاء موجودیت یا Entity گفته می شود. Entity Framework چیست ؟Entity Framework درواقع یکی از قدرتمندترین ORM های دسترسی به منابع داده است. به وسیله Entity Framework شما می توانید با انواع مختلف دیتابیس از قبیل SQL Server ، Sqlite و … کار کنید بدون اینکه نیاز به عملیات مستقیم در دیتابیس داشته باشید. این تکنولوژی چند ویژگی مهم دارد که توجه اکثر برنامه نویسان را به خود جلب کرده است.

کار کردن با Entity Framework بسیار ساده است.حتی یادگیری آن ده ها برابر ساده تر از مدل های مشابه مانند ADO.NET است.
سرعت در دسترسی به داده ها و اجرای دستورالعمل ها بسیار بالاست و در پروژه های بزرگ نیز می توان از آن استفاده کرد.
پیاده سازی آن بسیار سریع است و در زمان صرفه جویی می شود.
دیتابیس شما در قالب کلاس های شی گرا با سایر اجزای پروژه یکپارچه می شود و علاوه بر خوانایی بالا در کدنویسی، عملیات ارتقا و بروزرسانی نرم افزاری را سرعت می بخشد و از بروز خیلی از خطاها جلوگیری می کند.
در برخی از حالت ها شما نیاز به طراحی پایگاه داده ندارید! زیرا با استفاده از امکانات EF خود برنامه دیتابیس را از روی مدل یا کلاس های شما می سازد.

انواع دیتامدل در Entity Frameworkدر کتاب قبلی کمی درباره ی این مدل ها توضیح داده و قول داده بودم که در این کتاب مفصل در خصوص هر کدام صحبت کنم . چون مقاله ی حاضر مقدمه می باشد ، هر کدام را در فصل های مربوط به خود مفصل به بحث و بررسی خواهیم پرداخت. اما این مدل ها کدامند :

Database First Modeling : در این روش مدل ما از روی یک پایگاه داده موجود ایجاد می شود و می توان از طریق Entity Data Model Designer در Visual Studio تغییرات لازم را بر روی مدل انجام داد.
Model First Modeling : در این روش ابتدا مدل توسط برنامه نویس در محیط Entity Data Model Designer ایجاد میشود، سپس بطور خودکار پایگاه داده و کدها و اسکریپ های موردنیاز از روی مدل ساخته میشوند.
Code First Modeling: در این روش کلاس های معادل موجودیت ها (جداول) توسط برنامه نویس نوشته میشوند (این کلاس ها POCO-Plain OLD CLR Objects نامیده میشوند) سپس EF بطور خودکار پایگاه داده و مدل را از روی این کلاس ها میسازد. ما در مقالات حاضر با این نوع بیشتر آشنا شده و پروژه ی حاضر نیز تحت همین مدل سپری خواهد شد

مزایای استفاده از Entity Framework چیست ؟

سطح یادگیری ساده: کار با EF به نسبت بقیه ORMها تقریبا ساده تراست.
پشتیبانی از پایگاه داده های مختلف در نسخه ۴ به بعد (در حال حاضر نسخه ۶٫۲ وجود دارد).
توسعه فعال: Microsoft، قصد جدی در توسعه این قابلیت دارد. اضافه شدن امکانات زیاد به نسخه ۴ به بعد نشاندهنده همین مطلب هست. مثل امکان Code First، Lazy Loading و …که در نسخه ۴ به EF اضافه شده اند.
توسعه دهندگان قادرند تا با ساختار شیء گرایانه سازگار با انواع سیستم های مدیریت داده کار کنند.
پشتیبانی کامل از Linq.
نصب خودکار با Visual Studio.
مرتبط شدن چندین مدل مفهومی به یک ساختارپایگاه داده.
برنامه های کاربردی قادر خواهند بود تا در مدل مفهومی خود (conceptual model) محوریت بیشتری به خود برنامه ببخشند به گونه ای که شیء گرایی، ارث بری، گونه ها (Type) های پیچیده تر و روابط بین جداول و اشیاء بهتر پیاده سازی شوند.
برنامه نویس ها از کدنویسی زیادی پیچیده رها می شوند.
بدون کوچک ترین تغییر کد برنامه خواهیم توانست مدل ارتباط بین ساختار پایگاه داده و مدل مفهومی را تغییر دهیم.

چه زمانی از EF استفاده می کنیم؟

زمانی که بخواهیم برنامه ما به پایگاه داده های دیگری به جز Microsoft SQL Serverنیز دسترسی پیدا کند.
زمانی که بخواهیم domain models برای برنامه مان تعریف کنیم و از آن به عنوان لایه persistenceاستفاده نماییم.
زمانی که از یک راهکار ORMی استفاده کنیم که ممکن است کلاسهایمان رابط های ۱:۱ با پایگاه داده داشته باشد یا ممکن است ساختاری بسیار متفاوت و پیچیده در ارتباط با پایگاه داده دارا باشد.
زمانی که میخواهیم از یک ORM استفاده کنیم که ساختارهای سلسله مراتبی در آن، معادل های پایگاه داده ای متفاوتی داشته باشد. مانند وقتی که جدولی جهت نگهداری سلسله مراتب، جداولی برای هر یک ازکلاسها وجدولی جهت نگهداری گونه ای (Type) خاص داریم.
زمانی که وقتی میخواهیم از LINQ جهت نوشتن Queryها استفاده کنیم درحالیکه Queryدرپایگاه داده به شیوه خاص و درسلطه سازنده آن عمل میکند.
زمانی که استفاده از کلاسهایی که خودمان نوشتیم، درکنار کلاسهای تولیدشده توسط سیستم یا ارث بری ازکلاسهای پایه یا پیادهسازی رابطها درکلاسها.
زمانی که استفاده از یک ORM با حفظ کارآیی و امکان بهبود آن از طریقStored Procedureها و Queryهای کامپایل شده.

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

farjadp
شنبه 15 فروردین 1394, 06:54 صبح
آموزش Entity Framework 6 Code First – بخش اول (http://www.vaniait.com/entity-framework-6-code-first-part1/)

- لینک مستقیم (http://www.vaniait.com/entity-framework-6-code-first-part1/) | متاسفانه هنگام ارسال پست با ارور مواجه شدم : نوشته شما بیش از مقدار مجاز است (40899 کاراکتر). آن را تا مقدار مجاز 30000 کاراکتر کاهش دهید. برای همین مجبور شدم بخشی از آن را حذف کنم :(

http://www.vaniait.com/wp-content/uploads/2015/04/entity-framework-6-code-first-aid-training-mvc-net-Part1-vaniait.jpgدر بخش مقدمه (http://www.vaniait.com/entity-framework-6-code-first-aid-training-mvc-net-introduction/) با واژگان و نحوه ی کار entity framework آشنا شدیم و متوجه شدیم چرا باید از این تکنولوژی استفاده کنیم. حال در بخش اول سری مقالات «آموزش Entity Framework 6 Code First» وارد ویژوال استودیو شده و پروژه ی «دانشگاه وانیا» را شروع می کنیم.ایجاد پروژه MVC

مانند هر پروژه ای ویژوال استودیو را اجرا و از منوی File>New>Project را انتخاب و از پنجره ای که باز می شود ، زیر منوی Visual C#‎‎‎‎‎‎‎‎ و سپس زیر منوی Web را انتخاب می کنیم و در قسمت پایین نام پروژه ی خود را وارد می نمایید که ما در اینجا نام VaniaUniversity را برگزیدیم. (مانند شکل ۱-۱)http://www.vaniait.com/wp-content/uploads/2015/04/001.jpgشکل شماره ۱-۱ ( جهت مشاهده عکس در سایز اصلی بر روی آن کلیک کنید )

پنجره ی مرحله ی بعدی نوع پروژه است که شما می بایست MVC را انتخاب کنید (مانند شکل شماره ۱-۲)http://www.vaniait.com/wp-content/uploads/2015/04/002.jpg (http://www.vaniait.com/wp-content/uploads/2015/04/002.jpg)شکل شماره ۲-۱ ( جهت مشاهده عکس در سایز اصلی بر روی آن کلیک کنید )


و سپس روی گزینه ی Change Authentication کلیک کرده تا سطح دسترسی کل پروژه را معین نماییم.که ما در اینجا گزینه ی No Authentication را بر میگزینیم. (شکل ۱-۳ و ۱-۴)http://www.vaniait.com/wp-content/uploads/2015/04/003.jpgشکل شماره ۳-۱ ( جهت مشاهده عکس در سایز اصلی بر روی آن کلیک کنید )

http://www.vaniait.com/wp-content/uploads/2015/04/004.jpg
چنانچه با پنجره ای دیگر مواجه شدید بر روی متن No Thanks…. کلیک کنیدhttp://www.vaniait.com/wp-content/uploads/2015/04/005.jpg (http://www.vaniait.com/wp-content/uploads/2015/04/005.jpg)سپس بر روی OK کلیک کرده و منتظر می مانیم تا پروژه بارگذاری شود. همانگونه که در شکل ۱-۶ نیز مشاهده می شود ویژوال استودیو یکسری فایل و محتوا را به صورت پیشفرض برایمان ایجاد کرده. حتی امکان ثبت نام نیز وجود دارد! اما ما میخواهیم از همین اول راه خودمان را برویم و همزمان که بر روی EF کار می کنیم بر روی مواردی که لازمه ی یک سایت دانشگاهی است نیز تمرکز می نماییم. پس تغییرات را از همین قدم انجام میدهیم. از قسمت Solution Explorer به دنبال فایل _Layout.cshtml (مطابق شکل ۱-۶) می گردیم و آن را باز می کنیم.شکل شماره ۴-۱ ( جهت مشاهده عکس در سایز اصلی بر روی آن کلیک کنید )
http://www.vaniait.com/wp-content/uploads/2015/04/006.jpg (http://www.vaniait.com/wp-content/uploads/2015/04/006.jpg)شکل شماره ۶-۱ ( جهت مشاهده عکس در سایز اصلی بر روی آن کلیک کنید )
پیشنهاد می کنم قبل از هرگونه تغییر یکبار پروژه را بیلد و ران کنید تا پس از اعمال تغییرات ، متوجه آن شوید.
CTRL + Shift+ B و سپس CTRL + F5
حال تغییرات خود را مطابق کدهای زیر اعمال می نماییم.



<!DOCTYPE html><html><head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>@ViewBag.Title - دانشگاه آموزشی وانیا</title> @Styles.Render("~/Content/css") @Scripts.Render("~/bundles/modernizr")</head><body> <div class="navbar navbar-inverse navbar-fixed-top"> <div class="container"> <div class="navbar-header"> <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> @Html.ActionLink("دانشگاه وانیا", "Index", "Home", new { area = "" }, new { @class = "navbar-brand" }) </div> <div class="navbar-collapse collapse"> <ul class="nav navbar-nav"> <li>@Html.ActionLink("صفحه اول", "Index", "Home")</li> <li>@Html.ActionLink("درباره وانیا", "About", "Home")</li> <li>@Html.ActionLink("دانشجویان", "Index", "Student")</li> <li>@Html.ActionLink("اساتید", "Index", "Instructors")</li> <li>@Html.ActionLink("دوره ها", "Index", "Course")</li> <li>@Html.ActionLink("گروه های آموزشی", "Index", "Department")</li> </ul> </div> </div> </div> <div class="container body-content"> @RenderBody() <hr /> <footer> <p>&copy; @DateTime.Now.Year - VaniaIT.Com </p> </footer> </div> @Scripts.Render("~/bundles/jquery") @Scripts.Render("~/bundles/bootstrap") @RenderSection("scripts", required: false)</body></html>


در کتاب قبلی درخصوص نحوه ی لینک دهی صحبت کردیم اما برای تکمیل مبحث در اینجا نیز توضیح خواهیم داد





خط ۶ – ما در این خط تنها عنوانی استاتیک برای صفحات سایت اضافه کردیم .
خط ۱۹ – در عموم سایت ها وقتی روی نام سایت (در منو) و یا لوگو کلیک کنید وارد صفحه ی اصلی می شوید. ما در اینجا نیز تنها عنوانی که نمایش داده می شود را تغییر دادیم
خطوط ۲۳ الی ۲۸ – منوهایمان را مطابق نیاز تغییر دادیم. خاصیت @html.actionlink در اینجا وظیفه ی لینک دهی داینامیک را برعهده دارد. این خاصیت دارای چندین خاصیت متفاوت و متعدد است که در حال حاضر تنها سه تای آنها را مورد استفاده قرار دادیم. در اولین کوتیشن ما عنوانی را که می خواهیم نمایش دهیم را می نویسیم. کوتیشن دوم مدلی است که از یک کنترلر که در کوتیشن سوم تعیین کرده ایم فراخوانی می شود. به زبانی دیگر از سمت چپ به راست اینگونه خوانده می شود : وقتی روی این متن کلیک شد برو برام ایندکس رو از کنترلر Student بخون و کاربر رو به اون صفحه هدایت کن


پس از اجرا با صفحه ای مانند شکل ۱-۷ مواحه خواهیم شد
http://www.vaniait.com/wp-content/uploads/2015/04/007.pngشکل شماره ۷-۱ ( جهت مشاهده عکس در سایز اصلی بر روی آن کلیک کنید )



به ویژوال استودیو بازگشته و شروع کار با Entity Framework را آغاز می نماییم. برای شروع نیز می بایست انتیتی فریمورک را نصب کنیم. برای نصب از منوی Tools>Nuget Package Manager>Package Manager Console را انتخاب می نماییم.http://www.vaniait.com/wp-content/uploads/2015/04/008.jpg (http://www.vaniait.com/wp-content/uploads/2015/04/008.jpg)شکل شماره ۸-۱ ( جهت مشاهده عکس در سایز اصلی بر روی آن کلیک کنید )


از کنسول باز شده باید انتیتی را از گالری نوگت نصب کنیم. برای این کار نیاز است تا به اینترنت متصل باشیم و فرمان زیر را تایپ نماییم.




Install-Package EntityFramework





http://www.vaniait.com/wp-content/uploads/2015/04/009.jpg (http://www.vaniait.com/wp-content/uploads/2015/04/009.jpg)شکل شماره ۹-۱ ( جهت مشاهده عکس در سایز اصلی بر روی آن کلیک کنید )



همانگونه که متوجه می شوید پس از چند دقیقه فولدر رفرنسی که در سمت راست ویژوال استودیو وجود دارد باز شده و EF را اضافه می کند. چنانچه دسترسی به اینترنت ندارید می توانید این فایل DLL را از انتهای همین مطلب به صورت مجزا دانلود و به صورت دستی به پروژه اضافه نمایید.
جهت اطلاع از آخرین نسخه ی Entity Framework و دانلود آن می توانید به گالری NuGet در آدرس https://www.nuget.org/packages/EntityFramework مراجعه نمایید.nuget.org
حال شروع می کنیم به کلاس نویسی. اما قبل از آن نگاهی بیاندازیم به آنچه قرار است اتفاق بیفتدما سه کلاس اصلی با نام های Course و Enrollment و Student خواهیم داشت که هر سه به یکدیگر متصل هستند یعنی دانشجویان به نام نویسی و دوره ها نیز به نام نویسیhttp://www.vaniait.com/wp-content/uploads/2015/04/013.jpg (http://www.vaniait.com/wp-content/uploads/2015/04/013.jpg)شکل شماره ۱۰-۱ ( جهت مشاهده عکس در سایز اصلی بر روی آن کلیک کنید )

ایجاد دیتا مدل ها

برای ایجاد دیتا مدل می بایست بر روی فولدر Models رایت کلیک کرده و از گزینه ی Add گزینه ی Class را انتخاب نماییمhttp://www.vaniait.com/wp-content/uploads/2015/04/010.jpg (http://www.vaniait.com/wp-content/uploads/2015/04/010.jpg)شکل شماره ۱۱-۱ ( جهت مشاهده عکس در سایز اصلی بر روی آن کلیک کنید )

ما اولین دیتامدل یعنی Student را ایجاد می نماییمhttp://www.vaniait.com/wp-content/uploads/2015/04/011.jpg (http://www.vaniait.com/wp-content/uploads/2015/04/011.jpg)شکل شماره ۱۲-۱ ( جهت مشاهده عکس در سایز اصلی بر روی آن کلیک کنید )

پس از ایجاد این دیتامدل باز شده و شروع به کدنویسی می نماییم. برای این مدل ما نیاز داریم تا اطلاعات اولیه ی دانشجو را در این جدول ذخیره کنیم. کدهای زیر را می نویسیم





using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace VaniaUniversity.Models
{
public class Student
{
public int ID { get; set; }
public string LastName { get; set; }
public string FirstName { get; set; }
public DateTime EnrollmentDate { get; set; }

public virtual ICollection<Enrollment> Enrollments { get; set; }
}
}








خب، نگران نباشید الان همه ی خطوط را توضیح خواهیم داد :دی



خطوط ۱۰ الی ۱۳ ما فیلدهایی را که برای این جدول لازم است را تعریف کرده ایم. و هرکدام را نیز برابر Datatypeی قرار داده ایم.
خط ۱۰ فیلد آی دی اختصاصی جدول است که نوع INT و پراپرتری ID انتخاب نموده ایم . در آینده ای نزدیک به خصوصیت GUID شما را آشنا می کنیم و خواهید فهمید که آی دی را بهتر است از این نوع انتخاب کنیم. این فیلد کلید خارجی این کلاس می باشد.
خط ۱۱ نام فامیل دانشجو می باشد که از نوع رشته است
خط ۱۲ نام دانشجو می باشد که از نوع رشته است.
خط ۱۳ تاریخ نام نویسی دانشجو می باشد که از نوع تاریخ است.
خط ۱۵ نیز کالکشنی از Enrollmentی است که از دیتا مدلی تحت همین نام فراخوانی می شود. یعنی ما یک دیتا مدلی داریم که در این دیتامدل حاضر یعنی Student فراخوانی می شوند. به زبان دیگر این دو کلاس با یکدیگر ارتباط (relation) دارند. وظیفه ی این خط Navigation Property است، Navigation Property وظیفه ی نگهداری داده هایی را بر عهده دارند که در یک دیتا مدل دیگر کارایی دارند. در این پروژه خصوصیت Enrollments که در همین کلاس Student وجود دارد ، وظیفه ی نگهداری اطلاعات موجود در کلاس Enrollment را بر عهده دارد.
شما در خط ۱۵ به جای Enrollments هر اسم خاص دیگری نیز می توانید قرار دهید. ما تنها برای اینکه بدانیم این خصوصیت مربوط به چه چیزی است و هم نام ان نیز نباشد تنها یک “S” به انتهای آن اضافه کردیم. شما هر اسمی که خواستید می توانید بر روی آن بگذارید. این نام قرارداد شماست! (شکل ۱-۱۳ شماره ی ۲)
عموماً Navigation properties از نوع virtual ساخته می شوند که از توابع هسته ی مرکزی EF مورد استفاده واقع می شوند، مانند lazy loading. جهت اطلاعات بیشتر در این خصوص پیشنهاد می شود این مقاله (http://www.vaniait.com/goto/https://www.asp.net/entity-framework/tutorials/reading-related-data-with-the-entity-framework-in-an-asp-net-mvc-application) را مطالعه نمایید.


فرض کنید شما یک کمبوباکس دارید که نام کشورها در آن قرار دارد و در کمبوباکس دیگر نام شهرها. زمانیکه شما نام یک کشور را انتخاب می کنید می بایست نام شهرهای آن کشور در کمبوباکس دیگر نمایش داده شوند. دیتامدل اولی نام کشورها و آی دی یونیک آنها قرار دارد و همچنین کدی که نشان دهنده ی ارتباط این کلاس با کلاس شهرهاست. به این کد ما Navigation Property می گوییم.مرتضی پورمحمد
چون ما هنوز کلاس های دیگر را نساختیم ممکن است زیر نام Enrollment یک خط قرمز خطا کشیده شده باشد (شکل ۱-۱۳ شماره یک)
http://www.vaniait.com/wp-content/uploads/2015/04/012.jpg (http://www.vaniait.com/wp-content/uploads/2015/04/012.jpg)شکل شماره ۱۳-۱ ( جهت مشاهده عکس در سایز اصلی بر روی آن کلیک کنید )


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




using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace VaniaUniversity.Models
{

public enum Grade
{
A, B, C, D, E
}
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; }

}
}








توضیحات مربوط به این کلاس نیز به شرح زیر می باشد




دو کلاس دیگر با این کلاس ارتباط یک به چند دارند. به همین علت دو خاصیت INT می نویسیم که دو کلاس دیگر را معرفی می کنند . خطوط ۱۶ و ۱۷
ما در خط ۹ خاصیتی تحت عنوان Grade از نوع enum ایجاد کردیم و ۵ خاصیت استاتیک را به این خاصیت اختصاص دادیم تا در خط ۱۸ از اینها استفاده کنیم. Enum نوع داده شمارشی جهت تعاریف مقادیر ثابت و قابل شمارش در برنامه می باشد که بسیار کاربرد دارد.
دقت داشته باشید که در خط ۱۱ بنده اشتباه نکرد و مطمئناً کمی انگلیسی بلد هستم :دی و میدانم که بعد از D حرف Eقرار دارد، اما چون e یک حرف قراردادیست در اینجا نمی توانم از آن استفاده کنم .
در خط ۱۸ نیز این Grade را فراخوانی کرده و نام ان را نیز Grade قرار دادیم. اما جلوی Grade یک علامت سوال قرار دادیم که به معنای Nullable بودن است. یعنی کاربر می تواند آن را پر نکند و خالی بگذارد.
خط ۲۰ کلید خارجی ای است برای دیتا مدل کلاس Course
خط ۲۱ کلید خارجی ای است برای دیتا مدل کلاس Student

و در نهایت ایجاد دیتا مدل Course. کدهای زیر مربوط به این کلاس می باشد


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;


namespace VaniaUniversity.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; }
}
}















توضیحات مربوط به این کلاس نیز به شرح زیر می باشد:


خط ۱۸ خصوصیت Navigation Property مربوط به کلاس Enrollment است که بالاتر درباره ی آن صحبت شد. داده های این کلاس (Course) باید بتونن با چند داده از Enrollment ارتباط داشته باشند. یعنی کلاس Course با کلاس Enrollment ارتباط یک به چند دارد. یعنی تعدادی از دیتاهای کلاس Enrollment در کلاس Course موجودیت می یابد.
خط ۱۳ درباره ی خصوصیت DatabaseGenerated می باشد. در این مقاله (http://www.vaniait.com/goto/http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.schema.datab asegeneratedattribute%28v=vs.110%29.aspx) مفصل صحبت شده است و ما در آینده نیز به آن خواهیم پرداخت. اما در حال حاضر این را باید بگوییم که برای اجرای درست این خصوصیت نیاز است تا دو فضای نامی (namespace) یا همان using ها را به کلاس اضافه کنیم که ما در خطوط ۵ و ۶ این کار را انجام داده ایم. همچنین DatabaseGenerated جهت معرفی پراپرتی به عنوان Primary Key استفاده می شود. یعنی این خاصیت به پروژه می گوید که خط ۱۴ را PK برای کلاس Course معرفی نماید تا این ملاس بتواند دیتابیس را ایجاد نماید.

ایجاد Database Context

بنده در کتاب قبلی یعنی « آموزش MVC 5 (http://www.vaniait.com/goto/http://www.farjadp.com/%d8%a2%d9%85%d9%88%d8%b2%d8%b4-asp-net-mvc-5-%d8%a8%d9%87-%d8%b2%d8%a8%d8%a7%d9%86-%d8%b3%d8%a7%d8%af%d9%87/) » به شما گفتم که در پایان هر کلاس می بایست دیتاست را ایجاد کرده تا کلاس و دیتابیس ایجاد شود. اما این روند بسیار مبتدیانه است. اینگونه شما به اضای هر کلاس یک دیتابیس خواهید داشت! اگر همان پروژه را نگاه کنید متوجه می شوید که ۷-۸ دیتابیس وجود دارد. که خود این کلی مشکل داشت. فرض کنید شما یک ویو دارید و می خواهید از دو دیتامدل مختلف کمک بگیرید ، اگر از شیوه ی قدیم استفاده کنید هنگام Scaffold با ارور مواجه می شوید . برای همین می بایست تمامی دیتامدل ها را در یک کلاس جداگانه قرار داده و تمامی دیتاست ها را در این کلاس معرفی و تنظیم نماییم. (شکل ۱-۱۴)http://www.vaniait.com/wp-content/uploads/2015/04/Dbcontext.png (http://www.vaniait.com/wp-content/uploads/2015/04/Dbcontext.png)شکل شماره ۱۴-۱ ( جهت مشاهده عکس در سایز اصلی بر روی آن کلیک کنید )

معمولاً در پروژه های بزرگ کل دیتامدل ها را در پروژه ای جداگانه قرار داده تا اینگونه هم امنیت را بهبود بخشیم و هم دسترسی به لایه ی اطلاعات آسان تر باشد. اما در پروژه ی حاضر همه ی فعالیت ها را در همان پروژه انجام می دهیم. کافیست فولدری با نام DAL ایجاد و سپس کلاسی تحت نام SchoolContext بسازیم. توجه داشته باشید قسمت دوم دیتابیس کانتکس حتماً و باید Context باشید. داخل این کلاس کدهای زیر را می نویسیم.






using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using VaniaUniversity.Models;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;

namespace VaniaUniversity.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>();
}
}
}







این قسمت از دیتا مدل مهمترین بخش است. هراندازه تجربه و دانش شما در خصوص کلاس نویسی DbContext بیشتر و بهتر باشید، پروژه ای قدرتمند تر خواهید داشت. من نیز تا جایی که دانشم اجازه میدهد با شما در میان میگذارم.



شما برای کلاس نویسی DbContext احتیاج به فضای نامی خاص دیتابیس نویسی دارید. و چون قرار است با انتیتی کار کنیم خطوط ۶ و ۷ را اضافه کردیم و EF را به این کلاس معرفی کردیم. همچنین پیشنهاد می کنم جهت اطلاعات بیشتر در خصوص DbContext به این مقاله (http://www.vaniait.com/goto/http://msdn.microsoft.com/en-us/library/system.data.entity.dbcontext%28v=VS.103%29.aspx) مراجعه کنید.
در خط ۱۱ به این کلاس می گوییم که از DbContext ارث بری نماید.
خصوص ۱۷، ۱۸ و ۱۹ برای هر کلاسی که در فولدر Model ایجاد کردیم یک DBSet ایجاد می کنیم . اما این DbSet ها نیاز به یک ConnectionString دارند که ما در خط ۱۳ ان را ایجاد کردیم. البته در بخش های بعدی مفصل تر راجع به Web.Config و چگونگی اتصال رشته ارتباطی صحبت می کنیم. این کانکشن استرینگ نیاز به یک نام دارد که ما آن را هم نام کلاس قرار دادیم و شما می توانید هر نامی که دوست دارید بر روی آن بگذارید. ما آن را “SchoolContext” نامیدیم.
خب تا اینجا جداول هیچ مشکلی ندارند، فقط یک نکته باقی می ماند. به ازای هر دیتا مدلی که در فولدر مدل قرار دارد یک جدول در دیتابیس اضافه خواهد شد! برای جلوگیری از این مورد ما دستورات خط ۲۱ را اضافه کردیم که به دیتامدل می گوید از ازدیاد جداول جلوگیری کن. یعنی اگر ما این خط را ننویسیم یک حدول خواهیم داشت تحت نام Student، یک جدول با نام Course و یک جدول با نام Enrollment و در آینده هر کلاس دیتا مدلی که اضافه کنیم نیز به همین ترتیب، س ما این خط را نوشتیم تا همه ی این دیتابیس ها در یک دیتا بیس اصلی جمع شوند. که این کار را توسط دستور OnModelCrating تعریف کردیم. اما اینکه modelBuilder چیست و چرا به آن نیاز داریم در مقاله ی « Fluent API چیست؟ (http://www.vaniait.com/what-fluent-api/) » مفصل به آن پرداخته شد.

خب الان همه چیز آماده است تا شما از طریق Scaffold کنترلر و ویو را ایجاد و در نهایت پروژه را بدون مشکل اجرا کنید. اما پیشنهاد می کنم ابتدا یکسری داده ی نمونه که برنامه نویسان به آن seed می گویند وارد پروژه و سپس ران کنید. تا از این طریق کمی هم با Web.Config آشنا شویم. برای اینکار کافیست کلاسی جدید در فولدر DAL ایجاد و نام آن را SchoolInitializer بگذارید. حال وقت آن است تا دیتاهای تست وارد کنیم




using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Linq;
using System.Data.Entity;
using VaniaUniversity.Models;

namespace VaniaUniversity.DAL
{
public class SchoolInitializer : System.Data.Entity.DropCreateDatabaseIfModelChange s<SchoolContext>
{
protected override void Seed(SchoolContext context)
{
var students = new List<Student>
{
new Student{FirstName="Farjad",LastName="Pourmohammad",EnrollmentDate=DateTime.Parse("2014-09-01")},
new Student{FirstName="Hassan",LastName="Rouhani",EnrollmentDate=DateTime.Parse("2014-09-01")},
new Student{FirstName="Kiarash",LastName="Pourmohammad",EnrollmentDate=DateTime.Parse("2013-09-01")},
new Student{FirstName="M.Javad",LastName="Zarif",EnrollmentDate=DateTime.Parse("2012-09-01")},
new Student{FirstName="Mohammad",LastName="Khatami",EnrollmentDate=DateTime.Parse("2012-09-01")},
new Student{FirstName="Morteza",LastName="Pourmohammad",EnrollmentDate=DateTime.Parse("2010-09-01")},
new Student{FirstName="Mir Hossein",LastName="Musavi",EnrollmentDate=DateTime.Parse("2014-09-01")},
new Student{FirstName="Shahram",LastName="Nazeri",EnrollmentDate=DateTime.Parse("2009-09-01")}
};

students.ForEach(s => context.Students.Add(s));
context.SaveChanges();
var courses = new List<Course>
{
new Course{CourseID=1050,Title="Anthropology",Credits=3,},
new Course{CourseID=4022,Title="Programming",Credits=3,},
new Course{CourseID=4041,Title="Macroeconomics",Credits=3,},
new Course{CourseID=1045,Title="Mathic",Credits=4,},
new Course{CourseID=3141,Title="Development",Credits=4,},
new Course{CourseID=2021,Title="MVC.NET",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();
}
}
}





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




<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectio nFactory, EntityFramework">
<parameters>
<parameter value="mssqllocaldb" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>














و کدهای زیر را به آن اضافه می نماییم



<contexts>
<context type="VaniaUniversity.DAL.SchoolContext, VaniaUniversity">
<databaseInitializer type="VaniaUniversity.DAL.SchoolInitializer, VaniaUniversity" />
</context>
</contexts>












ادامه مقاله (http://www.vaniait.com/entity-framework-6-code-first-part1/) در سایت شرکت طراحی وبسایت (http://www.vaniait.com/) وانیا