PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : آموزش entity framework 6 code first - بخش اول



toltek
December 19th, 2016, 14:28
.
http://www.vaniait.com/Upload/ArticleImages/7e9a20fb011a4dbe91311dd1e087636c.jpg


لینک مقاله : http://www.vaniait.com/Articles/entity-framework-6-code-first-part1-63 (http://www.vaniait.com/Articles/entity-framework-6-code-first-part1-63)

در بخش مقدمه (http://www.vaniait.com/Articles/entity-framework-training-mvc-net-introduction-65)با واژگان و نحوه ی کار entity framework آشنا شدیم و متوجه شدیم چرا باید از این تکنولوژی استفاده کنیم. حال در بخش اول سری مقالات «آموزش Entity Framework 6 Code First» وارد ویژوال استودیو شده و پروژه ی «دانشگاه وانیا» را شروع می کنیم.


ایجاد پروژه MVC
مانند هر پروژه ای ویژوال استودیو را اجرا و از منوی File>New>Project را انتخاب و از پنجره ای که باز می شود ، زیر منوی Visual C# و سپس زیر منوی Web را انتخاب می کنیم و در قسمت پایین نام پروژه ی خود را وارد می نمایید که ما در اینجا نام VaniaUniversity را برگزیدیم. (مانند شکل ۱-۱)






شکل شماره ۱-۱ ( جهت مشاهده عکس در سایز اصلی بر روی آن کلیک کنید )


پنجره ی مرحله ی بعدی نوع پروژه است که شما می بایست 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


شکل شماره ۷-۱ ( جهت مشاهده عکس در سایز اصلی بر روی آن کلیک کنید )[/caption]


به ویژوال استودیو بازگشته و شروع کار با Entity Framework را آغاز می نماییم. برای شروع نیز می بایست انتیتی فریمورک را نصب کنیم. برای نصب از منوی Tools>Nuget Package Manager>Package Manager Console را انتخاب می نماییم.





شکل شماره ۸-۱ ( جهت مشاهده عکس در سایز اصلی بر روی آن کلیک کنید )

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



Install-Package EntityFramework







شکل شماره ۹-۱ ( جهت مشاهده عکس در سایز اصلی بر روی آن کلیک کنید )


همانگونه که متوجه می شوید پس از چند دقیقه فولدر رفرنسی که در سمت راست ویژوال استودیو وجود دارد باز شده و EF را اضافه می کند. چنانچه دسترسی به اینترنت ندارید می توانید این فایل DLL را از انتهای همین مطلب به صورت مجزا دانلود و به صورت دستی به پروژه اضافه نمایید.


جهت اطلاع از آخرین نسخه ی Entity Framework و دانلود آن می توانید به گالری NuGet در آدرس https://www.nuget.org/packages/EntityFramework مراجعه نمایید.


حال شروع می کنیم به کلاس نویسی. اما قبل از آن نگاهی بیاندازیم به آنچه قرار است اتفاق بیفتد


ما سه کلاس اصلی با نام های Course و Enrollment و Student خواهیم داشت که هر سه به یکدیگر متصل هستند یعنی دانشجویان به نام نویسی و دوره ها نیز به نام نویسی







شکل شماره ۱۰-۱ ( جهت مشاهده عکس در سایز اصلی بر روی آن کلیک کنید )






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


برای ایجاد دیتا مدل می بایست بر روی فولدر 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. جهت اطلاعات بیشتر در این خصوص پیشنهاد می شود این مقاله را مطالعه نمایید.

[/icon_list] فرض کنید شما یک کمبوباکس دارید که نام کشورها در آن قرار دارد و در کمبوباکس دیگر نام شهرها. زمانیکه شما نام یک کشور را انتخاب می کنید می بایست نام شهرهای آن کشور در کمبوباکس دیگر نمایش داده شوند. دیتامدل اولی نام کشورها و آی دی یونیک آنها قرار دارد و همچنین کدی که نشان دهنده ی ارتباط این کلاس با کلاس شهرهاست. به این کد ما Navigation Property می گوییم. چون ما هنوز کلاس های دیگر را نساختیم ممکن است زیر نام Enrollment یک خط قرمز خطا کشیده شده باشد (شکل ۱-۱۳ شماره یک)








شکل شماره ۱۳-۱ ( جهت مشاهده عکس در سایز اصلی بر روی آن کلیک کنید )


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


حال به ساخت دو کلاس دیگر یعنی دیتامدل 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 می باشد. در این مقاله مفصل صحبت شده است و ما در آینده نیز به آن خواهیم پرداخت. اما در حال حاضر این را باید بگوییم که برای اجرای درست این خصوصیت نیاز است تا دو فضای نامی (namespace) یا همان using ها را به کلاس اضافه کنیم که ما در خطوط ۵ و ۶ این کار را انجام داده ایم. همچنین DatabaseGenerated جهت معرفی پراپرتی به عنوان Primary Key استفاده می شود. یعنی این خاصیت به پروژه می گوید که خط ۱۴ را PK برای کلاس Course معرفی نماید تا این ملاس بتواند دیتابیس را ایجاد نماید.


ایجاد Database Context


بنده در کتاب قبلی یعنی « آموزش MVC 5 » به شما گفتم که در پایان هر کلاس می بایست دیتاست را ایجاد کرده تا کلاس و دیتابیس ایجاد شود. اما این روند بسیار مبتدیانه است. اینگونه شما به اضای هر کلاس یک دیتابیس خواهید داشت! اگر همان پروژه را نگاه کنید متوجه می شوید که ۷-۸ دیتابیس وجود دارد. که خود این کلی مشکل داشت. فرض کنید شما یک ویو دارید و می خواهید از دو دیتامدل مختلف کمک بگیرید ، اگر از شیوه ی قدیم استفاده کنید هنگام Scaffold با ارور مواجه می شوید . برای همین می بایست تمامی دیتامدل ها را در یک کلاس جداگانه قرار داده و تمامی دیتاست ها را در این کلاس معرفی و تنظیم نماییم. (شکل ۱-۱۴)











Dbcontext | Database Context mvc 5





شکل شماره ۱۴-۱ ( جهت مشاهده عکس در سایز اصلی بر روی آن کلیک کنید )


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

لینک مقاله : http://www.vaniait.com/Articles/entity-framework-6-code-first-part1-63