ایجاد کردن یک Entity Data Model

همانطور که در معرفی این دوره آموزشی خدمتتان عرض شد روش database-first با ایجاد کردن یک Entity Data Model که از این پس به طور کوتاه به آن EDM نیز می‌گوییم از یک دیتابیس از قبل موجود آغاز خواهد شد. در واقع Entity Framework از EDM به منظور انجام عملیات مربوط به دیتابیس استفاده می‌کند. EDM یک model است که entity ها و relationship های بین آنها را توصیف می کند. در ادامه از یک دیتابیس از قبل موجود به نام School یک EDM را ایجاد خواهیم کرد. به منظور انجام این کار ویژوال استودیو را باز کرده و شبیه به تصویر زیر یک console application ساده را ایجاد کنید.


پس از آن بر روی پروژه راست کلیک کرده و گزینه Properties را انتخاب کنید و قسمت Target Framework مربوط به برنامه را بر روی گزینه .NET Framework 4.5 تنظیم کنید. این موضوع در تصویر زیر نشان داده شده است.


به منظور اضافه کردن یک Entity Data Model بر روی پروژه راست کلیک کرده و گزینه Add و سپس NewItem را انتخاب کنید. پس از باز شدن پنجره Add New Item یک گزینه به ADO.NET Entity Data Model وجود دارد، آن را انتخاب کنید و یک نام مناسب برای EDM برای مثال School را انتخاب کرده و سپس Add را کلیک کنید. این موضوع در تصویر زیر نشان داده شده است.


این قضیه باعث می‌شود که یک پنجره دیگر به نام Entity Data Model Wizard نشان داده شود. در این پنجره 4 گزینه مختلف در اختیار شما قرار خواهد گرفت. گزینه اول که EF Designer from database نام دارد به منظور استفاده از Entity Framework database first مورد استفاده قرار می گیرد. گزینه Empty EF Designer model به منظور استفاده از روش model-first مورد استفاده قرار می گیرد. گزینه Empty Code First model و Code First from database برای استفاده از روش Code-First مورد استفاده قرار می‌گیرد. در همین قسمت توصیه می‌کنیم که از آموزش متنی Entity Framework Code First و کار با داده ها استفاده کنید. به این دلیل که می خواهیم از روش database-first استفاده کنیم از گزینه اول یعنی EF Designer from database استفاده خواهیم کرد و پس از آن بر روی دکمه Next کلیک خواهیم نمود. این موضوع در تصویر زیر نشان داده شده است.


در مرحله بعد باید یک connection را به دیتابیس مورد نظرتان ایجاد کنید. اگر این اولین باری است که می خواهید یک EDM را اضافه کنید نیاز به ایجاد کردن یک connection با استفاده از دکمه New Connection دارید. این موضوع در تصویر زیر نشان داده شده است.


در پنجره بعدی که Connection Properties نام دارد نام سرور مورد نظرتان را انتخاب کرده و سپس نام دیتابیس را وارد کنید. اگر دیتابیس به صورت محلی بر روی کامپیوتر فعلی وجود دارد می توانید server name را با گزینه . لحاظ کنید که این به معنی local server است و سپس دیتابیس مورد نظرتان را از قسمت پایین همین پنجره استفاده نمایید. این موضوع در تصویر زیر نشان داده شده است.


پس از آن بر روی دکمه ok کلیک کنید. این قضیه باعث می‌شود که یک connection string به فایل app.config اضافه گردد. پس از آن بر روی دکمه Next کلیک نمایید. این موضوع در تصویر زیر نیز نشان داده شده است.


در مرحله بعدی باید نسخه Entity Framework مورد نظر خود را انتخاب کنید. ما برای این آموزش از Entity Framework 6.0 استفاده می کنیم. این موضوع در تصویر زیر نشان داده شده است.


لطفاً دقت کنید که اگر با استفاده از NuGet آخرین نسخه از Entity Framework را نصب کرده باشید این قسمت دیگر به شما نشان داده نخواهد شد. در مرحله بعدی تمامی Table ها و View ها و Stored Procedure های مربوط به دیتابیس انتخاب شده نشان داده می شود. می توانید هر کدام از این موارد را به راحتی انتخاب کرده و بر روی دکمه Finish کلیک کنید تا آنها به برنامه اضافه شوند این موضوع در تصویر زیر نشان داده شده است.


در ادامه در رابطه با گزینه های مختلف مربوط به این فرم صحبت خواهیم کرد.

گزینه Pluralize or singularize generated object names باعث می شود که نام entityset مورد نظر شما به صورت مفرد آورده شود. این موضوع زمانی کاربرد دارد که نام جدول متناظر در دیتابیس به صورت جمع آورده شده باشد. بگذارید برای روشن شدن این موضوع مثالی بزنیم. فرض کنید که در دیتابیس SchoolDB یک جدول به نام Students وجود دارد. بنابراین entityset مورد نظر به صورت مفرد و Student ایجاد خواهد شد. این موضوع بر روی رابطه ها نیز لحاظ می شود. به عبارت دیگر اگر بین جداول رابطه هایی از نوع one-to-many و یا many-to-many وجود داشته باشد نام این رابطه ها به صورت جمع آورده خواهد شد. برای مثال فرض کنید که جدول Students یک رابطه many-to-many با جدول Course دارد. این موضوع باعث می‌شود که در Student یک navigation property از نوع کلاس Course با نام Courses تعریف شود. دومین گزینه ای که می‌توان در این فرم تنظیم کرد Include foreign key columns in the model نام دارد. این موضوع باعث می‌شود که یک foreign key property به طور صراحتاً و یا explicit برای نشان دادن رابطه foreign key در model لحاظ بگردد. برای مثال فرض کنید که جدول Student یک رابطه از نوع one-to-many با جدول Standard دارد. برای نشان دادن این رابطه در model کلاس Student شامل یک property به نام StandardId خواهد بود که در کنار یک reference navigation property به نام Standard تنظیم می شود. حال اگر این گزینه غیر فعال بشود فقط reference navigation property مورد نظر یعنی همان Standard در model لحاظ خواهد شد و پروپرتی StandardId لحاظ نخواهد شد. گزینه سوم که Import selected stored procedures and functions into entity model نام دارد باعث می‌شود که stored procedure ها و function ها به درون مدل import بشوند. قبل ازEntity Framework 6.0 انجام دادن این کار به صورت دستی انجام می شد که با استفاده از ازEntity Framework 6 خوشبختانه نیازی به انجام دادن این کار به صورت دستی وجود ندارد. در پایان با کلیک کردن بر روی دکمه Finish فایل School.edmx به پروژه اضافه خواهد شد. حال می توانید با دوبار کلیک کردن بر روی این فایل EDM designer را باز کنید. این موضوع باعث می‌شود تمامی entity های متناظر با جداول دیتابیس و همچنین روابط بین آنها شبیه به تصویر زیر نشان داده شود.


ضمناً EDM جزئیات مربوط به provider و connection string را در فایل App.config قرار می‌دهد. این موضوع در کد زیر نشان داده شده است.

<?xml version="1.0"?>

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

<startup>

<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>

</startup>

<entityFramework>

<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework"/>

<providers>

<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer"/>

</providers>

</entityFramework>

<connectionStrings>

<add name="SchoolDBEntities" connectionString="metadata=res://*/SchoolDB.csdl|res://*/SchoolDB.ssdl|res://*/SchoolDB.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.\sqlexpress;initial catalog=SchoolDB;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient"/>

</connectionStrings>

</configuration>

پس تا به اینجا توانستیم یک Entity Data Model که یک فایل با پسوند edmx هست را برای یک دیتابیس از قبل موجود به پروژه اضافه کنیم. دقت کنید که یک فایل EDM در واقع یک فایل XML می باشد که اگر آن را با یک ویرایشگر XML باز کنید شامل سه قسمت با نام‌های Conceptual schema و یا CSDL و Storage schema و یا SSDL و mapping schema و یا MSL می باشد. برای انجام این کار بر روی فایل SchoolDB.edmx راست کلیک کرده و سپس گزینه Open with را انتخاب کنید. این موضوع در تصویر زیر نشان داده شده است.


از قسمت باز شده گزینه XML (text) Editor را انتخاب کنید. این موضوع در تصویر زیر نشان داده شده است.


ویژوال استودیو نمی تواند model را در Design view و XML به طور همزمان نشان بدهد. بنابراین پیغامی نشان می دهد که نیاز دارد Design view را ببندد. با نشان داده شدن این پیغام بر روی دکمه Yes کلیک کنید. این موضوع باعث می‌شود که فایل edmx در قالب XML نشان داده شود. تصویر زیر این موضوع را نشان می‌دهد.


همانطور که می بینید 3 قسمت SSDL و CSDL و MSL در این قسمت نشان داده شده اند. با باز کردن هر کدام از این قسمت‌ها کدهای XML آنها را مشاهده می کنید. دقت کنید که عملاً نیازی به ویرایش کردن داده های درون این فایل XML ندارید و می توانید با استفاده از Model Browser که در قسمت بعد به آن خواهیم پرداخت عملیات مورد نظرتان را انجام بدهید. در ادامه در رابطه با اجزای تشکیل دهنده فایل School.edmx و یا همان EDM صحبت خواهیم کرد.

قسمت Entity-Table Mapping

همان طور که می دانید هر entity در EDM به جدول متناظر در دیتابیس نگاشت شده است. برای دیدن این نگاشت و یا اصطلاحاً entity-table mapping می توانید بر روی EDM designer راست کلیک کرده و گزینه Table Mapping را انتخاب کنید. علاوه بر این اگر نام property مربوط به entity ها را از درون designer تغییر بدهید سپس table mapping به صورت خودکار این تغییرات را نشان خواهد داد. لطفاً تصویر زیر را ببینید.


قسمت Context & Entity Classes

با ایجاد شدن یک Entity Data Model یک کلاس context و همچنین entity class های متناظر با جداول دیتابیس ایجاد خواهند شد. برای دیدن این موضوع می توانید فایل edmx را در solution explorer باز کرده و فایل های <EDM Name>.Context.tt و همچنین<EDM Name>.tt را مشاهده کنید. این موضوع در تصویر زیر نشان داده شده است.


بررسی فایل School.Context.tt

این یک فایل T4 template می باشد که کلاس context را به صورت خودکار با هر تغییر اتفاق افتاده بر روی Entity Data Model به‌روزرسانی می‌کند. علاوه بر این با باز کردن این فایل می توانید فایل context مورد نظر را که در یک فایل با نام <EDM Name>.context.cs وجود دارد ببینید. نام پیش فرض کلاس کانتکس، <DB Name>Entities می باشد. برای مثال کلاس context مربوط به یک دیتابیس به نام SchoolDB را SchoolDBEntities خواهید یافت که از کلاس DbContext ارث بری کرده است. این موضوع در تصویر زیر نشان داده شده است.


بررسی فایل School.tt

فایل School.tt نیز یک فایل T4 template می باشد که entity class های متناظر با جداول دیتابیس را به صورت خودکار ایجاد می کند. entity class ها در واقع کلاسهای POCO و یا Plain Old CLR Object می باشند. کدی که در قسمت زیر مشاهده می کنید کلاس Student را نشان می‌دهد.

public partial class Student

{

public Student()

{

this.Courses = new HashSet<Course>();

}

public int StudentID { get; set; }

public string StudentName { get; set; }

public Nullable<int> StandardId { get; set; }

public byte[] RowVersion { get; set; }

public virtual Standard Standard { get; set; }

public virtual StudentAddress StudentAddress { get; set; }

public virtual ICollection<Course> Courses { get; set; }

}

در رابطه با تمامی object های موجود در EDM و بررسی کردن آنها با Model Browser در قسمت بعد صحبت خواهیم