PDA

View Full Version : آشنایی با Entity Framework 7



MortezaGity
یک شنبه 16 فروردین 1394, 18:10 عصر
Entity Framework (http://provid.ir/%d8%a8%d8%b3%d8%aa%d9%87-%db%8c-%d8%ac%d8%a7%d9%85%d8%b9-%d8%a2%d9%85%d9%88%d8%b2%d8%b4-entity-framework/) یکی از ORM هایی است که در ساخت برنامه های دات نت مورد استفاده قرار می گیرد. برنامه هایی که سعی در کار کردن با بانک های اطلاعاتی دارند به راحتی می توانند از Entity Framework استفاده کنند. همین جا به شما پیشنهاد می کنیم که از بسته ی جامع آموزش Entity Framework 5 از وبسایت پرووید (http://provid.ir/%d8%a8%d8%b3%d8%aa%d9%87-%db%8c-%d8%ac%d8%a7%d9%85%d8%b9-%d8%a2%d9%85%d9%88%d8%b2%d8%b4-entity-framework/) استفاده کنید تا با Entity Framework و قابلیت ها و کار کردن با آن به صورت کامل آشنا شوید.
اما در این آموزش، هدف ما معرفی و صحبت کردن در رابطه با قابلیت های جدید Entity Framework 7 است. آخرین نسخه ای Entity Framework (http://provid.ir/%d8%a8%d8%b3%d8%aa%d9%87-%db%8c-%d8%ac%d8%a7%d9%85%d8%b9-%d8%a2%d9%85%d9%88%d8%b2%d8%b4-entity-framework/) که در هنگام تنظیم این آموزش از طرف مایکروسافت معرفی شده است. این آموزش در چند پست بر روی وبسایت پرووید قرار می گیرد که در هر پست به یکی از قابلیت های جدید Entity Framework 7 اشاره می شود. این پست مربوط به اولین قسمت از این آموزش می باشد.
اپن سورس بودن (Open Source)
شبیه ورژن ششم از Entity Framework، ورژن هفتم نیز بصورت اپن سورس ارائه می شود. نسخه های قبلی Entity Framework در سایت CodePlex منتشر می شدند ولی نسخه ی هفتم از Entity Framework در سایت Git Hub منتشر خواهد شد. در حال حاضر می توانید با کلیک کردن بر روی این لینک https://github.com/aspnet/EntityFramework به صفحه ی مورد نظر Entity Framework رفته و شاهد رشد کردن آن باشید. ویژگی های جدید را ببینید و کدهای که هر روزه به آن اضافه می شود را کنترل کنید.


Entity Framework 6 هنوز هم محبوب است
نگران نباشید. اغلب افراد فکر می کنند که مجبورند سریعا به سمت Entity Framework 7 بروند ولی این موضوع اجباری نیست. بدون شک Entity Framework نسخه ی ششم و پنجم هم هنوز کاملاً پشتیبانی می شود. دقیقاً شبیه ADO.NET. هر چند که Entity Framework (http://provid.ir/%d8%a8%d8%b3%d8%aa%d9%87-%db%8c-%d8%ac%d8%a7%d9%85%d8%b9-%d8%a2%d9%85%d9%88%d8%b2%d8%b4-entity-framework/) سال هاست که محبوب ترین تکنولوژی دسترسی به داده ها در برنامه های دات نت است ولی هنوز هم ADO.NET وجود دارد و از کدهایی که قبلاً نوشته اید پشتیبانی می شود. مثال دیگر از این موضوع استفاده از ASP.NET در حضور گزینه ای شبیه MVC است. هرچند که امروزه اغلب برنامه نویسان تمایل دارند که به دلیل ویژگی های جدید MVC (http://provid.ir/%d8%a8%d8%b3%d8%aa%d9%87-%db%8c-%d8%a2%d9%85%d9%88%d8%b2%d8%b4-asp-net-mvc-%d8%af%d8%b1-%d9%82%d8%a7%d9%84%d8%a8-%d9%be%d8%b1%d9%88%da%98%d9%87/)از این فریم ورک استفاده کنند ولی هنوز هم ASP.NET Web Forms (http://provid.ir/%d8%a8%d8%b3%d8%aa%d9%87-%db%8c-asp-net-%d9%88-entity-framework-%d8%af%d8%b1-%d9%82%d8%a7%d9%84%d8%a8-%d9%be%d8%b1%d9%88%da%98%d9%87/) وجود دارد، استفاده می شود و کاربردهای خود را نشان می دهد. یکی از موضوع های مهم در رابطه با Entity Framework اپن سورس بودن آن است. این موضوع باعث می شود که هر چند مایکروسافت به صورت جدی به ورژن ششم Entity Framework نپردازد ولی برنامه نویسانی که به صورت داوطلبانه بر روی آن کار می کنند، مرتباً به روز رسانی هایی را انجام دهند. به علاوه، با استفاده از Nuget (http://provid.ir/%d8%a8%d8%b3%d8%aa%d9%87-%db%8c-%d8%a2%d9%85%d9%88%d8%b2%d8%b4-nuget/)شما به تمامی پکیج های ورژن های قبلی Entity Framework دسترسی دارید و در صورت نیاز می توانید از آنها استفاده کنید. بنابراین، هر چند Entity Framework ورژن هفت معرفی شده است ولی نگران کدهایی که قبلا با ورژن ششم از Entity Framework (http://provid.ir/%d8%a8%d8%b3%d8%aa%d9%87-%db%8c-%d8%ac%d8%a7%d9%85%d8%b9-%d8%a2%d9%85%d9%88%d8%b2%d8%b4-entity-framework/) می نوشتید نباشید.
در دامه به صورت کلی ویژگی های جدید Entity Framework 7 را لیست کرده ایم:


علاوه بر پشتیبانی از بانک های اطلاعاتی رابطه ای (Relational Database)، از بانک های غیر رابطه ای و همچنین اشیا درون حافظه نیز پشتیبانی می شود.
پشتیبانی از ماشین های که از دات نت فریم ورک به صورت کامل استفاده نمی کنند. به عبارت دیگر، شما می توانید Entity Framework 7 را بر وی Windows Phone، برنامه های Windows Store، سیستم عامل های لینوکس و Mac نیز اجرا کنید.
پیاده سازی بسیاری از قابلیت هایی که برنامه نویسان در ورژن قبلی Entity Framework درخواست کرده بودند ولی قابل انجام نبود.
پشتیبانی از برنامه هایی که به صورت کامل از دات نت فریم ورک استفاده می کنند شبیه WPF (http://provid.ir/%d8%a8%d8%b3%d8%aa%d9%87-%db%8c-%d8%ac%d8%a7%d9%85%d8%b9-%d8%a2%d9%85%d9%88%d8%b2%d8%b4-wpf-%d8%af%d8%b1-%d9%88%db%8c%da%98%d9%88%d8%a7%d9%84-%d8%a7%d8%b3%d8%aa%d8%a7%d8%af%db%8c%d9%88-2010/)و ASP.NET (http://provid.ir/%d8%a8%d8%b3%d8%aa%d9%87-%db%8c-%d8%a2%d9%85%d9%88%d8%b2%d8%b4-asp-net-mvc-%d8%af%d8%b1-%d9%82%d8%a7%d9%84%d8%a8-%d9%be%d8%b1%d9%88%da%98%d9%87/) و غیره.
Entity Framework 7 دقیقا شبیه ASP.NET 5 عرضه خواهد شد و می توان از آن در برنامه های تحت وب به راحتی استفاده کرد.


کد نویسی مشابه، کد بیس (Code Base) جدید
اگر به نسخه ی ششم از Entity Framework (http://provid.ir/%d8%a8%d8%b3%d8%aa%d9%87-%db%8c-%d8%ac%d8%a7%d9%85%d8%b9-%d8%a2%d9%85%d9%88%d8%b2%d8%b4-entity-framework/) نگاه کنیم (به خصوص ورژن Ninja) خواهیم دید که بسیاری از ویژگی های جدید به API مربوطه اضافه شد. برای مثال، انجام عملیات ناهمگام (Asynchronous) در بانک های اطلاعاتی، دسترسی به پایپ لاین کوئری ها، تغییرات در روش Code First و بسیاری موارد دیگر از این دسته اند. این موضوع نشانگر این است که با هر ورژن جدید از Entity Framework ویژگی های جدید و تکنیک هایی برای افزایش کارایی نیز معرفی می شود. یکی از موضوعات مهم در ساخت ورژن هفتم از Entity Framework (http://provid.ir/%d8%a8%d8%b3%d8%aa%d9%87-%db%8c-%d8%ac%d8%a7%d9%85%d8%b9-%d8%a2%d9%85%d9%88%d8%b2%d8%b4-entity-framework/) پیاده سازی مسائلی بود که با Code Base سابق Entity Framework (http://provid.ir/%d8%a8%d8%b3%d8%aa%d9%87-%db%8c-%d8%ac%d8%a7%d9%85%d8%b9-%d8%a2%d9%85%d9%88%d8%b2%d8%b4-entity-framework/) قابل انجام نبود. با ایجاد تغییر در Code Base ورژن هفتم از Entity Framework (http://provid.ir/%d8%a8%d8%b3%d8%aa%d9%87-%db%8c-%d8%ac%d8%a7%d9%85%d8%b9-%d8%a2%d9%85%d9%88%d8%b2%d8%b4-entity-framework/)، این قابلیت ها اضافه شد. اینکه ورژن هفتم از Entity Framework باید به عنوان یک تکنولوژی دسترسی به داده (Data Access Technology) جدید معرفی شود و یا اینکه به عنوان ورژن جدید Entity Framework عرضه شود نیز تصمیمی بوده که کارکنان مایکروسافت در آن اختلاف نظر داشته اند. آنها حتی به این فکر کرده اند که ورژن هفتم را به عنوان Entity Framework Light معرفی کنند ولی در نهایت، این تکنولوژی جدید که Code Base کاملاً مورد تغییر قرار گرفته است به عنوان Entity Framework 7 معرفی شده است.


نگهداشتن قابلیت های قبلی
بدون شک با انجام هر به روز رسانی در هر تکنولوژی و برنامه ای، قسمت های جدیدی اضافه و قسمت هایی حذف می شوند. Entity Framework 7 نیز از این قاعده مستثنا نیست. در ورژن هفتم از Entity Framework (http://provid.ir/%d8%a8%d8%b3%d8%aa%d9%87-%db%8c-%d8%ac%d8%a7%d9%85%d8%b9-%d8%a2%d9%85%d9%88%d8%b2%d8%b4-entity-framework/) نیز قسمت هایی اضافه خواهند شد و قسمت هایی که در نسخه های قبلی کمتر مورد استفاده قرار می گرفتند، حذف می شوند. در Entity Framework 7 هنوز می توانید از کلاس های DbContext، DbSet استفاده کنید. به علاوه پرس و جوهای LINQ (http://provid.ir/%d8%a2%d9%85%d9%88%d8%b2%d8%b4-linq-%d8%af%d8%b1-%d8%b3%db%8c-%d8%b4%d8%a7%d8%b1%d9%be/)و استفاده از SaveChanges قابل استفاده هستند. به عنوان مثال، به کلاس Context زیر که در Entity Framework 7 نوشته شده است دقت کنید:


1
2
3
4

public class BreweryContext : DbContext {
public DbSet<Brewery> Breweries { get; set; }
public DbSet<Beer> Beers { get; set; }
}






به علاوه کد زیر در Entity Framework 7 نوشته شده است که دقیقاً مشابه کدی است که در ورژن ششم از Entity Framework می نوشتیم:


1
2
3
4
5
6

public void StoreBeers(List<Beer> beers) {
using (var context = new BreweryContext()) {
context.Beers.AddRange(beers);
context.SaveChanges();
}
}







همچنین یک کوئری ساده:


1
2
3

using (var context = new BreweryContext()) {
return context.Breweries.Where(b=>b.Location.Contains("Vermont"));
}







همانطور که گفته شد با هر آپدیتی قسمت هایی از برنامه که کمتر مورد استفاده قرار می گرفتند حذف شده و قسمت های جدید اضافه می شوند. در ورژن هفتم از Entity Framework (http://provid.ir/%d8%a8%d8%b3%d8%aa%d9%87-%db%8c-%d8%ac%d8%a7%d9%85%d8%b9-%d8%a2%d9%85%d9%88%d8%b2%d8%b4-entity-framework/) نگاشت (Mapping) پیچیده نیز حذف شده اند. این موضوع اغلب به دلیل پیاده سازی قابلیت های جدید است که برنامه نویسان تقاضا کرده اند. بنابراین، در نسخه ی هفتم از Entity Framework تغییراتی را مشاهده خواهیم کرد. با این وجود بیشتر ویژگی های پیشین یه قوت خود باقی می مانند.


حذف EDMX و ادامه ی Database First
همانطور که بسته ی جامع آموزش Entity Framework 5 (http://provid.ir/%d8%a8%d8%b3%d8%aa%d9%87-%db%8c-%d8%ac%d8%a7%d9%85%d8%b9-%d8%a2%d9%85%d9%88%d8%b2%d8%b4-entity-framework/) گفته شد، سه روش متفاوت برای شروع به کار با تکنولوژی Entity Framework در برنامه وجود دارد: Model First، Database First، Code First. جالب است که بدانید در نسخه ی هفتم از Entity Framework از روش Model First پشتیبانی نمی شود. به عبارت دیگر، در نسخه ی جدید از Entity Framework شما نمی توانید مدل خود را ایجاد کنید تا برنامه بر اساس فایل XML (http://provid.ir/%d8%a8%d8%b3%d8%aa%d9%87-%db%8c-%d8%a2%d9%85%d9%88%d8%b2%d8%b4-xml/)تولید شده کلاس های POCO و Context را برای شما ایجاد کند.
روش Code First همچنان پشتیبانی می شود. در این روش، شما کلاس های Entity خود را در قالب کلاس های POCO ایجاد می کنید و پس از آن Entity Framework با استفاده از این کلاس های مدل برنامه را در حافظه ساخته و در نهایت بانک اطلاعاتی مورد نظر را ایجاد می کند. برخی از برتری های این روش سریع بودن آن، انعطاف پذیری و تمیز تر ماندن پروژه (عدم اضافه شدن فایل های اضافی) به برنامه است. این روش در ساخت برنامه های ASP.NET MVC (http://provid.ir/%d8%a8%d8%b3%d8%aa%d9%87-%db%8c-%d8%a2%d9%85%d9%88%d8%b2%d8%b4-%d9%85%d9%82%d8%af%d9%85%d8%a7%d8%aa%db%8c-asp-net-mvc/) بسیار کاربرد دارد. (در بسته ی آموزش مقدماتی ASP.NET MVC (http://provid.ir/%d8%a8%d8%b3%d8%aa%d9%87-%db%8c-%d8%a2%d9%85%d9%88%d8%b2%d8%b4-asp-net-mvc-%d8%af%d8%b1-%d9%82%d8%a7%d9%84%d8%a8-%d9%be%d8%b1%d9%88%da%98%d9%87/) ما از این روش برای ساخت برنامه ی تحت وبی استفاده کرده ایم.)
با این وجود، اگر به استفاده از واسط کاربری Entity Framework در روش Model First عادت کرده اید، برنامه های جایگزینی هستند که می توانند این کار را برای شما انجام دهند. برای مثال، LLBLGen Pro Designer و Devart Entity Developer دوتا از برنامه هایی هستند که می توانید برای کار با Entity Framework در روش Model First از آنها استفاده کنید.


ردپای کمتر، دستگاه ها و سیستم عامل های بیشتر
یکی از اهداف مایکروسافت در روند توسعه ی Entity Framework 7 کم کردن تعداد DLL هایی است که کاربر برای کار به آنها نیاز دارد. در نسخه های قبلی از Entity Framework (http://provid.ir/%d8%a8%d8%b3%d8%aa%d9%87-%db%8c-%d8%ac%d8%a7%d9%85%d8%b9-%d8%a2%d9%85%d9%88%d8%b2%d8%b4-entity-framework/) این موضوع مورد توجه قرار نگرفته بود. در نسخه ی هفتم شما برای هر کاری فقط به تعداد کمی DLL نیاز دارید. برای مثال، اگر می خواهید از Entity Framework در کار با بانک های اطلاعاتی SQL Server استفاده کنید، نیاز به EntityFramework.dll، DLL مربوط به SQL Server و یک DLL برای کار با بانک های اطلاعاتی رابطه ای دارید. اگر می خواهید از Migration استفاده کنید، نیاز به DLL متفاوتی دارید که می توانید در شروع کار آن را در نظر نگیرید. به علاوه، مایکروسافت سعی کرده است که این DLL ها از طریق NuGet در قالب یک سری NuGet Package معرفی کند که این موضوع کار را بیش از پیش راحت می کند.
این روش مزیت دیگری نیز دارد. Entity Framework (http://provid.ir/%d8%a8%d8%b3%d8%aa%d9%87-%db%8c-%d8%ac%d8%a7%d9%85%d8%b9-%d8%a2%d9%85%d9%88%d8%b2%d8%b4-entity-framework/) دیگر به نسخه ی کامل دات نت فریم ورک وابسته نیست و دستگاه هایی که از Mono استفاده می کنند نیز می توانند از Entity Framework استفاده کنند. برای مثال، می توانید از Entity Framework (http://provid.ir/%d8%a8%d8%b3%d8%aa%d9%87-%db%8c-%d8%ac%d8%a7%d9%85%d8%b9-%d8%a2%d9%85%d9%88%d8%b2%d8%b4-entity-framework/) در Linux استفاده کنید. سیستم عامل Mac و دستگاه های Windows Phone نیز می توانند یک گزینه های دیگر باشند.


فراتر از بانک های اطلاعاتی رابطه ای
از ابتدای کار، مایکروسافت در نظر داشت که Entity Framework را طوری طراحی کند که برای گستره ی وسیعی از بانک های اطلاعاتی مورد استفاده قرار بگیرد. در زمان معرفی Entity Framework بانک های اطلاعاتی غیر رابطه ای به وسعت امروزه نبودند. امروزه بانک های اطلاعاتی شبیه NoSQL که یک بانک اطلاعاتی غیر رابطه ای است بسیار محبوب شده اند. دقت کنید که Entity Framework (http://provid.ir/%d8%a8%d8%b3%d8%aa%d9%87-%db%8c-%d8%ac%d8%a7%d9%85%d8%b9-%d8%a2%d9%85%d9%88%d8%b2%d8%b4-entity-framework/) یک ORM است و این کلمه به معنی Object Relational Mapper می باشد. به کلمه ی Relational که دلالت بر بانک های اطلاعاتی رابطه ای دارد دقت کنید. با تمامی این موضوع ها، Entity Framework 7 به صورت سطح بالا از کار با بانک های اطلاعاتی غیر رابطه ای پشتیبانی می کند. لطفاً دقت کنید که گفته شد یک پشتیبانی سطح بالا: بین بانک های اطلاعاتی رابطه ای و غیر رابطه ای تفاوت های زیادی وجود دارد که Entity Framework (http://provid.ir/%d8%a8%d8%b3%d8%aa%d9%87-%db%8c-%d8%ac%d8%a7%d9%85%d8%b9-%d8%a2%d9%85%d9%88%d8%b2%d8%b4-entity-framework/) سعی بر کنترل کردن همه ی آنها ندارد ولی در کل می توانید کوئری های ساده را که در کار با بانک های اطلاعاتی رابطه ای استفاده می کنید، برای کار با بانک های اطلاعاتی غیر رابطه ای در نظر بگیرید.
به عنوان مثال، Microsoft Azure Table Storage یک بانک اطلاعاتی غیر رابطه ای است که در زیر با استفاده از Entity Framework 7 مورد دسترسی قرار گرفته است:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

public class WarrantyContext : DbContext
{
public DbSet<WarrantyInfo> Warranties { get; set; }
protected override void OnConfiguring(DbContextOptions options) {
var connection =
ConfigurationManager.ConnectionStrings["WarrantyConnection"]
.ConnectionString;
options.UseAzureTableStorage(connection);
}
protected override void OnModelCreating(ModelBuilder builder) {
builder.Entity<WarrantyInfo>()
.ForAzureTableStorage()
.PartitionAndRowKey(w => w.BikeModelNo, w => w.BikeSerialNo);
}
}







در کد بالا متد OnConfiguring را می بینید که یک متد جدید است. این متد شبیه کلاس DbConfiguration عمل می کند که برای پیکربندی کلاس DbContext در زمان اجرا مورد استفاده قرار می گیرد. به علاوه، اکستنشن متد builder.UseAzureTableStorage به دلیل نصب پکیج EntityFramework.AzureTableStorage بر روی سیستم اضافه شده است. از همین الگو می توان برای دسترسی به گستره ای از بانک های اطلاعاتی مختلف استفاده کرد. برای مثال، در زیر کدی را می بینید که برای کار با SQLite استفاده شده است:


1
2
3
4
5

protected override void OnConfiguring(DbContextOptions builder) {
string dir = ApplicationData.Current.LocalFolder.Path;
string connection = "Filename=" + Path.Combine(dir, "VermontBrewery.db");
builder.UseSQLite(connection);
}







در کد بالا نیز اکستنشن متد UseSQLite را به دلیل استفاده از پکیج EntityFramework.SQLite می بینیم.


قابلیت های بیشتر، توانایی های متعدد، انعطاف پذیری بالاتر
همانطور که کم و بیش در قسمت های قبلی این آموزش در وبسایت پرووید دیدید، Entity Framework 7 سعی کرده است که قابلیت های بیشتری نسبت به نسخه های قبلی اضافه کند. برخی از این قابلیت ها مدت هاست که توسط برنامه نویسان تقاضا داده شده است. برای مثال در نسخه ی هفتم از Entity Framework قابلیت Unique Foreign Key در ساختن مدل پیاده سازی شده است. به علاوه، سعی بر آن است که از Table Valued Function پشتیبانی شود. (در بسته ی جامع Entity Framework 5 (http://provid.ir/%d8%a8%d8%b3%d8%aa%d9%87-%db%8c-%d8%ac%d8%a7%d9%85%d8%b9-%d8%a2%d9%85%d9%88%d8%b2%d8%b4-entity-framework/) از این موضوع صحبت شده است.) کار کردن با داده های Disconnected نیز یکی دیگر از موضوع های مهم در توسعه ی Entity Framework 7 بوده است. این موضوع اغلب برای برنامه نویسان دردسر ساز است که سعی شده است در نسخه ی هفتم از Entity Framework (http://provid.ir/%d8%a8%d8%b3%d8%aa%d9%87-%db%8c-%d8%ac%d8%a7%d9%85%d8%b9-%d8%a2%d9%85%d9%88%d8%b2%d8%b4-entity-framework/) به صورت دقیق تر و تمیزتر پیاده سازی شود.
به علاوه، استفاده کردن از بانک های اطلاعاتی غیر رابطه ای شبیه Azure یکی دیگر از تلاش های مایکروسافت برای توسعه ی Entity Framework (http://provid.ir/%d8%a8%d8%b3%d8%aa%d9%87-%db%8c-%d8%ac%d8%a7%d9%85%d8%b9-%d8%a2%d9%85%d9%88%d8%b2%d8%b4-entity-framework/) بوده است.
با تمام صحبت هایی که در این آموزش در وبسایت پرووید گفته شد، قابلیت های بیشتری در نسخه ی هفتم از Entity Framework وجود دارد که جای بحث و صحبت داشته باشد. بهتر است صبر کنیم و ببینیم مایکروسافت این بار قرار است چگونه همه ی ما را شگفت زده کند.