ایمیل
admin [at] VaniaIT.Com
امور مشتریان
پرتال کاربران - CRM
تلفن
9122830795(98+)
طراحی وب سایت

آموزش Entity Framework 6 Code First - بخش اول


[icon icon="fa-windows"] ایجاد پروژه MVC

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

[caption id="attachment_2092" align="alignnone" width="694"]۰۰۱

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

پنجره ی مرحله ی بعدی نوع پروژه است که شما می بایست MVC را انتخاب کنید (مانند شکل شماره ۱-۲)

 

[caption id="attachment_2093" align="alignnone" width="507"

۰۰۲

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

و سپس روی گزینه ی Change Authentication کلیک کرده تا سطح دسترسی کل پروژه را معین نماییم.

که ما در اینجا گزینه ی No Authentication را بر میگزینیم. (شکل ۱-۳ و ۱-۴)

 

 

۰۰۳

 

 

۰۰۴

چنانچه با پنجره ای دیگر مواجه شدید بر روی متن No Thanks.... کلیک کنید

۰۰۵

سپس بر روی OK کلیک کرده و منتظر می مانیم تا پروژه بارگذاری شود. همانگونه که در شکل ۱-۶ نیز مشاهده می شود ویژوال استودیو یکسری فایل و محتوا را به صورت پیشفرض برایمان ایجاد کرده. حتی امکان ثبت نام نیز وجود دارد! اما ما میخواهیم از همین اول راه خودمان را برویم و همزمان که بر روی EF کار می کنیم بر روی مواردی که لازمه ی یک سایت دانشگاهی است نیز تمرکز می نماییم. پس تغییرات را از همین قدم انجام میدهیم. از قسمت Solution Explorer به دنبال فایل _Layout.cshtml (مطابق شکل ۱-۶) می گردیم و آن را باز می کنیم.

شکل شماره ۴-۱ ( جهت مشاهده عکس در سایز اصلی بر روی آن کلیک کنید ) [caption id="attachment_2096" align="alignnone" width="592"]

۰۰۶

 

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

[blockquote style="s1"]پیشنهاد می کنم قبل از هرگونه تغییر یکبار پروژه را بیلد و ران کنید تا پس از اعمال تغییرات ، متوجه آن شوید.

CTRL + Shift+ B و سپس CTRL + F5

[/blockquote]

حال تغییرات خود را مطابق کدهای زیر اعمال می نماییم.

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

در کتاب قبلی درخصوص نحوه ی لینک دهی صحبت کردیم اما برای تکمیل مبحث در اینجا نیز توضیح خواهیم داد [icon_list icon="fa-list"]

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

[/icon_list] پس از اجرا با صفحه ای مانند شکل ۱-۷ مواحه خواهیم شد [caption id="attachment_2100" align="alignnone" width="528"]

۰۰۷

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

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

 

[caption id="attachment_2101" align="alignnone" width="505"]

 

۰۰۸

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

Install-Package EntityFramework

  [caption id="attachment_2102" align="alignnone" width="520"]

۰۰۹

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

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

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

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

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

[caption id="attachment_2103" align="alignnone" width="461"]

 

۰۱۳

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

[icon icon="fa-windows"] ایجاد دیتا مدل ها

برای ایجاد دیتا مدل می بایست بر روی فولدر Models رایت کلیک کرده و از گزینه ی Add گزینه ی Class را انتخاب نماییم

 

[caption id="attachment_2105" align="alignnone" width="564"]

۰۱۰

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

ما اولین دیتامدل یعنی Student را ایجاد می نماییم

 

[caption id="attachment_2106" align="alignnone" width="562"]

 

۰۱۱

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

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

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; }
    }
}

خب، نگران نباشید الان همه ی خطوط را توضیح خواهیم داد :دی [icon_list icon="fa-list"]

  • خطوط ۱۰ الی ۱۳ ما فیلدهایی را که برای این جدول لازم است را تعریف کرده ایم. و هرکدام را نیز برابر Datatypeی قرار داده ایم.
  • خط ۱۰ فیلد آی دی اختصاصی جدول است که نوع INT و پراپرتری ID انتخاب نموده ایم . در آینده ای نزدیک به خصوصیت GUID شما را آشنا می کنیم و خواهید فهمید که آی دی را بهتر است از این نوع انتخاب کنیم. این فیلد کلید خارجی این کلاس می باشد.
  • خط ۱۱ نام فامیل دانشجو می باشد که از نوع رشته است
  • خط ۱۲ نام دانشجو می باشد که از نوع رشته است.
  • خط ۱۳ تاریخ نام نویسی دانشجو می باشد که از نوع تاریخ است.
  • خط ۱۵ نیز کالکشنی از Enrollmentی است که از دیتا مدلی تحت همین نام فراخوانی می شود. یعنی ما یک دیتا مدلی داریم که در این دیتامدل حاضر یعنی Student فراخوانی می شوند. به زبان دیگر این دو کلاس با یکدیگر ارتباط (relation) دارند. وظیفه ی این خط Navigation Property است، Navigation Property وظیفه ی نگهداری داده هایی را بر عهده دارند که در یک دیتا مدل دیگر کارایی دارند. در این پروژه خصوصیت Enrollments که در همین کلاس Student وجود دارد ، وظیفه ی نگهداری اطلاعات موجود در کلاس Enrollment را بر عهده دارد.
  • شما در خط ۱۵ به جای Enrollments هر اسم خاص دیگری نیز می توانید قرار دهید. ما تنها برای اینکه بدانیم این خصوصیت مربوط به چه چیزی است و هم نام ان نیز نباشد تنها یک "S" به انتهای آن اضافه کردیم. شما هر اسمی که خواستید می توانید بر روی آن بگذارید. این نام قرارداد شماست! (شکل ۱-۱۳ شماره ی ۲)
  • عموماً Navigation properties از نوع virtual ساخته می شوند که از توابع هسته ی مرکزی EF مورد استفاده واقع می شوند، مانند lazy loading. جهت اطلاعات بیشتر در این خصوص پیشنهاد می شود این مقاله را مطالعه نمایید.

[/icon_list] [blockquote author="مرتضی پورمحمد"]فرض کنید شما یک کمبوباکس دارید که نام کشورها در آن قرار دارد و در کمبوباکس دیگر نام شهرها. زمانیکه شما نام یک کشور را انتخاب می کنید می بایست نام شهرهای آن کشور در کمبوباکس دیگر نمایش داده شوند. دیتامدل اولی نام کشورها و آی دی یونیک آنها قرار دارد و همچنین کدی که نشان دهنده ی ارتباط این کلاس با کلاس شهرهاست. به این کد ما Navigation Property می گوییم.[/blockquote] چون ما هنوز کلاس های دیگر را نساختیم ممکن است زیر نام Enrollment یک خط قرمز خطا کشیده شده باشد (شکل ۱-۱۳ شماره یک) [caption id="attachment_2112" align="alignnone" width="573"]

۰۱۲

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

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

حال به ساخت دو کلاس دیگر یعنی دیتامدل 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; }

    }
}

توضیحات مربوط به این کلاس نیز به شرح زیر می باشد [icon_list icon="fa-list"]

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

[/icon_list]

و در نهایت ایجاد دیتا مدل 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; }
    }
}

توضیحات مربوط به این کلاس نیز به شرح زیر می باشد: [icon_list icon="fa-list"]

  • خط ۱۸ خصوصیت Navigation Property مربوط به کلاس Enrollment است که بالاتر درباره ی آن صحبت شد. داده های این کلاس (Course) باید بتونن با چند داده از Enrollment ارتباط داشته باشند. یعنی کلاس Course با کلاس Enrollment ارتباط یک به چند دارد. یعنی تعدادی از دیتاهای کلاس Enrollment در کلاس Course موجودیت می یابد.
  • خط ۱۳ درباره ی خصوصیت DatabaseGenerated می باشد. در این مقاله مفصل صحبت شده است و ما در آینده نیز به آن خواهیم پرداخت. اما در حال حاضر این را باید بگوییم که برای اجرای درست این خصوصیت نیاز است تا دو فضای نامی (namespace) یا همان using ها را به کلاس اضافه کنیم که ما در خطوط ۵ و ۶ این کار را انجام داده ایم. همچنین DatabaseGenerated جهت معرفی پراپرتی به عنوان Primary Key استفاده می شود. یعنی این خاصیت به پروژه می گوید که خط ۱۴ را PK برای کلاس Course معرفی نماید تا این ملاس بتواند دیتابیس را ایجاد نماید.

[/icon_list]

[icon icon="fa-windows"] ایجاد Database Context

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

 

[caption id="attachment_2118" align="alignnone" width="516"]

 

Dbcontext | Database Context mvc 5

 

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

معمولاً در پروژه های بزرگ کل دیتامدل ها را در پروژه ای جداگانه قرار داده تا اینگونه هم امنیت را بهبود بخشیم و هم دسترسی به لایه ی اطلاعات آسان تر باشد. اما در پروژه ی حاضر همه ی فعالیت ها را در همان پروژه انجام می دهیم. کافیست فولدری با نام 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 بیشتر و بهتر باشید، پروژه ای قدرتمند تر خواهید داشت. من نیز تا جایی که دانشم اجازه میدهد با شما در میان میگذارم. [icon_list icon="fa-list"]

  • شما برای کلاس نویسی DbContext احتیاج به فضای نامی خاص دیتابیس نویسی دارید. و چون قرار است با انتیتی کار کنیم خطوط ۶ و ۷ را اضافه کردیم و EF را به این کلاس معرفی کردیم. همچنین پیشنهاد می کنم جهت اطلاعات بیشتر در خصوص DbContext به این مقاله مراجعه کنید.
  • در خط ۱۱ به این کلاس می گوییم که از DbContext ارث بری نماید.
  • خصوص ۱۷، ۱۸ و  ۱۹ برای هر کلاسی که در فولدر Model ایجاد کردیم یک DBSet ایجاد می کنیم . اما این DbSet ها نیاز به یک ConnectionString دارند که ما در خط ۱۳ ان را ایجاد کردیم. البته در بخش های بعدی مفصل تر راجع به Web.Config و چگونگی اتصال رشته ارتباطی صحبت می کنیم. این کانکشن استرینگ نیاز به یک نام دارد که ما آن را هم نام کلاس قرار دادیم و شما می توانید هر نامی که دوست دارید بر روی آن بگذارید. ما آن را "SchoolContext" نامیدیم.
  • خب تا اینجا جداول هیچ مشکلی ندارند، فقط یک نکته باقی می ماند. به ازای هر دیتا مدلی که در فولدر مدل قرار دارد یک جدول در دیتابیس اضافه خواهد شد! برای جلوگیری از این مورد ما دستورات خط ۲۱ را اضافه کردیم که به دیتامدل می گوید از ازدیاد جداول جلوگیری کن. یعنی اگر ما این خط را ننویسیم یک حدول خواهیم داشت تحت نام Student، یک جدول با نام Course و یک جدول با نام Enrollment و در آینده هر کلاس دیتا مدلی که اضافه کنیم نیز به همین ترتیب، س ما این خط را نوشتیم تا همه ی این دیتابیس ها در یک دیتا بیس اصلی جمع شوند. که این کار را توسط دستور OnModelCrating تعریف کردیم.  اما اینکه modelBuilder چیست و چرا به آن نیاز داریم در مقاله ی «  Fluent API چیست؟  » مفصل به آن پرداخته شد.

[/icon_list] خب الان همه چیز آماده است تا شما از طریق 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.DropCreateDatabaseIfModelChanges<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();
        }
    }
}

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

  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, 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>

  یعنی باید کدهای فایل web.config مانند زیر باشند

<?xml version="1.0" encoding="utf-8"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=301880
  -->
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <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>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" />
  </system.web>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" />
        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Optimization" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="1.1.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-5.2.2.0" newVersion="5.2.2.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <entityFramework>
      <contexts>
    <context type="VaniaUniversity.DAL.SchoolContext, VaniaUniversity">
      <databaseInitializer type="VaniaUniversity.DAL.SchoolInitializer, VaniaUniversity" />
    </context>
  </contexts>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
</configuration>

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

[icon icon="fa-windows"] تنظیمات ابتدایی EF جهت استفاده از دیتابیس SQL Server Express LocalDB

LocalDB یک نسخه ی لایت از پروژه ی بزرگ SQL Server هست که معمولاً در فولدر App_Date نگهداری میشه. لوکال دیتابیس به صورت کلی در پروژه های تحت وب بی نیاز از IIS و نرم افزار SQL می باشد البته این بدین معناست که بودن یا نبودن اینها هیچ خللی در روند انجام پروژه های تحت وب ایجاد نمیکنه. و این رو هم اضافه کنم که لوکال دیتابیس به راحتی میتونه به SQL Server و SQL Azure مهاحرت کنه یعنی انتقال پیدا کنه. در ویژوال استودیو ۲۰۱۳ این لوکال دیتابیس به صورت پیش فرض نصب شده است و نیازی به استفاده و نصب و یا رفع مشکلاتی از پشی تعیین شده نمی باشد. به صورت پیش فرض در EF کلاسی در Connection String وجود دارد با عنوان context . در روت پروژه فایل Web.config را باز کنید. البته یک وب کانفیگ نیز در فولدر ویو وجود دارد که کا با آن کاری نداریم. این فایل را باز کرده و بین تگ های ConfigSection کدهای زیر را اضافه می کنیم

  <connectionstrings>
    <add name="SchoolContext" connectionstring="Data Source=(LocalDb)\v11.0;Initial Catalog=VaniaUniversity1;Integrated Security=SSPI;" providername="System.Data.SqlClient" />
  </connectionstrings>

بعد از اینکه خط های بالا را تایپ کردید شبیه شکل ۱-۱۵ خواهد شد [caption id="attachment_2130" align="alignnone" width="534"]

۰۱۵

 

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

[icon icon="fa-Windows"] ایجاد اولین Controller و View از کلاس Student

حالا نوبت آن رسیده تا دسترنج خود را بچشیم! لذت بخش ترین لحظه پیش روی شماست. زیرا با چند کلیک ساده می توانید کلی تغییرات و اعمال مختلف را مشاهده کنید. معجزه ای با نام Scaffolding در MVC ...

بر روی فولدر Controller راست کلیک کرده و از زیر منیو Add گزینه ی New Scaffolde Item را انتخاب نمایید

 

[caption id="attachment_2131" align="alignnone" width="593"]

 

۰۱۶

 

شکل شماره ۱۶-۱ ( جهت مشاهده عکس در سایز اصلی بر روی آن کلیک کنید )[/caption]   سپس از پنجره ی باز شده گزینه ی دوم یعنی MVC5 Controller with views, using Entrity Framework را انتخاب و Add را بزنید [caption id="attachment_2132" align="alignnone" width="609"]

۰۱۷

 

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

  • Model Class  را از لیست باز شونده Student (VaniaUniversity.Models) انتخاب نمایید
  • Data Context Class را از لیست باز شونده  SchoolContext (VaniaUniversity.DAL)  انتخاب نمایید
  • Controller name را ا StudentController تایپ نمایید

 

[caption id="attachment_2133" align="alignnone" width="643"]

۰۱۸

شکل شماره ۱۸-۱ ( جهت مشاهده عکس در سایز اصلی بر روی آن کلیک کنید )[/caption]   اگر با پیغام خطایی مانند شکل زیر مواجه شدید یکبار کل پروژه را ذخیره و Build نمایید سپس مراحل بالا را دوباره طی نمایید [caption id="attachment_2134" align="alignnone" width="527"]

 

۰۱۹

شکل شماره ۱۹-۱ ( جهت مشاهده عکس در سایز اصلی بر روی آن کلیک کنید )[/caption]   در برخی مواقع ممکن است با ارور زیر مواجه شوید [alerts title="ارور در Scaffolding" type="error"]Exception has been thrown by the target of an invocation[/alerts]

erro-Scaffold

که علل مختلفی دارد و راه حل های متفاوتی، به عنوان مثال

  • آپدیت / دانگرید انتیتی. توسط دستور زیر یکبار EF رو از پروژه پاک و نسخه ی پیشنهادی ۶٫۱٫۱ را نصب کنید
Uninstall-Package EntityFramework -Force

Install-Package EntityFramework 
  •  تغییر در کانکشن استرینگ  در فایل web.config
  <connectionStrings>
    <add name="SchoolContext" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=VaniaUniversity2;Integrated Security=SSPI;" providerName="System.Data.SqlClient" />
  </connectionStrings>
  •  کامنت کردن قسمت داده های نمونه در فایل web.config
...
  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
  </system.webServer>
  <entityFramework>
    <!--<contexts>
      <context type="VaniaUniversity.DAL.SchoolContext, VaniaUniversity">
        <databaseInitializer type="VaniaUniversity.DAL.SchoolInitializer, VaniaUniversity" />
      </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>
...

 

خب برگردیم به پروژه... وقتی Scaffold کردید چند لحظه ای طول می کشد تا کنترلر و ویو ساخته شود. وقتی ساخته شد مشاهده می کنید که مایکروسافت همه ی کارهای CRUD و ویو را بدون مشکل برایتان انجام داده و چندین ساعت برنامه نویسی شما را جلو انداخته است. برای مشاهده نیز می توانید وارد فولدر کنترلر شوید و کلاس StudentsController.cs را باز کنید.

[caption id="attachment_2140" align="alignnone" width="668"]

۰۲۰

 

شکل شماره ۲۰-۱ ( جهت مشاهده عکس در سایز اصلی بر روی آن کلیک کنید )[/caption]     و در قسمت ویو ها نیز تمامی ویوهای لازم را برایتان ایجاد کرده است [caption id="attachment_2141"

align="alignnone" width="291"]

۰۲۱

 

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

در نهایت کافیست یکبار دیگر پروژه را بیلد کنید CTRL + Shift + B و سپس CTRL + F5 را بزنید تا پروژه بدون مشکل برایتان در مرورگر ران شود. وقتی روی منوی دانشجویان کلیک می کنید وارد صفحه ی اول کنترلر Student خواهید شد و لیست موجودی که در قسمت داده های نمونه ایجاد کرده بودیم را مشاهده خواهید کرد ( شکل ۱-۲۲ )

 

[caption id="attachment_2142" align="alignnone" width="563"]

 

۰۲۲

شکل شماره ۲۲-۱ ( جهت مشاهده عکس در سایز اصلی بر روی آن کلیک کنید )[/caption]   با کلیک بر روی ویرایش و جزییات و دیگر موارد مشاهده خواهید کرد که همه ی گزینه ها بدون مشکل کار خواهند کرد. حتی می توانید دیتا نیز اضافه کنید. امتحان کنید! حال نگاهی به دیتابیس بیاندازید [caption id="attachment_2143" align="alignnone" width="469"]

۰۲۳

 

شکل شماره ۲۳-۱ ( جهت مشاهده عکس در سایز اصلی بر روی آن کلیک کنید )[/caption]   میبینید که جداول ایجاد شده اند و چنانچه اطلاعات جدول دانشجویان را درخواست دهید ، مشاهده می کنید که تمامی آنها بدون مشکل در دیتابیس نیز ذخیره شده اند. مانند شکل ۱-۲۴ [caption id="attachment_2144" align="alignnone" width="468"]

 

۰۲۴

 

شکل شماره ۲۴-۱ ( جهت مشاهده عکس در سایز اصلی بر روی آن کلیک کنید )[/caption]   [icon icon="fa-download"] نیازمندی های پروژه [alerts title="Entity Framework" type="info" fade="1"] EntityFramework.6.1.0 با حجم ۷٫۵۰ مگابایت[/alerts] [alerts title="سورس پروژه" type="info" fade="1"]  دانلود فایل سورس پروژه آموزش Entity Framework 6 Code First - بخش اول با حجم ۱۷٫۵۰ مگابایت[/alerts]  

/ پایان آموزش Entity Framework 6 Code First - بخش اول /