# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > دسترسی به داده ها (ADO.Net و LINQ و ...) >  آشنایی با Entity Framework 7

## MortezaGity

Entity Framework  یکی از ORM هایی است که در ساخت برنامه های دات نت مورد استفاده قرار می  گیرد. برنامه هایی که سعی در کار کردن با بانک های اطلاعاتی دارند به راحتی  می توانند از Entity Framework استفاده کنند. همین جا به شما پیشنهاد می  کنیم که از بسته ی جامع آموزش Entity Framework 5 از وبسایت پرووید استفاده کنید تا با Entity Framework و قابلیت ها و کار کردن با آن به صورت کامل آشنا شوید.
 اما در این آموزش، هدف ما معرفی و صحبت کردن در رابطه با قابلیت های جدید Entity Framework 7 است. آخرین نسخه ای 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  سال هاست که محبوب ترین تکنولوژی دسترسی به داده ها در برنامه های دات نت  است ولی هنوز هم ADO.NET وجود دارد و از کدهایی که قبلاً نوشته اید  پشتیبانی می شود. مثال دیگر از این موضوع استفاده از ASP.NET در حضور گزینه  ای شبیه MVC است. هرچند که امروزه اغلب برنامه نویسان تمایل دارند که به  دلیل ویژگی های جدید MVC از این فریم ورک استفاده کنند ولی هنوز هم ASP.NET Web Forms  وجود دارد، استفاده می شود و کاربردهای خود را نشان می دهد. یکی از موضوع  های مهم در رابطه با Entity Framework اپن سورس بودن آن است. این موضوع  باعث می شود که هر چند مایکروسافت به صورت جدی به ورژن ششم Entity  Framework نپردازد ولی برنامه نویسانی که به صورت داوطلبانه بر روی آن کار  می کنند، مرتباً به روز رسانی هایی را انجام دهند. به علاوه، با استفاده از  Nuget شما  به تمامی پکیج های ورژن های قبلی Entity Framework دسترسی دارید و در صورت  نیاز می توانید از آنها استفاده کنید. بنابراین، هر چند Entity Framework  ورژن هفت معرفی شده است ولی نگران کدهایی که قبلا با ورژن ششم از Entity Framework می نوشتید نباشید.
 در دامه به صورت کلی ویژگی های جدید Entity Framework 7 را لیست کرده ایم:

علاوه بر پشتیبانی از بانک های اطلاعاتی رابطه ای (Relational  Database)، از بانک های غیر رابطه ای و همچنین اشیا درون حافظه نیز  پشتیبانی می شود.پشتیبانی از ماشین های که از دات نت فریم ورک به صورت کامل استفاده نمی  کنند. به عبارت دیگر، شما می توانید Entity Framework 7 را بر وی Windows  Phone، برنامه های Windows Store، سیستم عامل های لینوکس و Mac نیز اجرا  کنید.پیاده سازی بسیاری از قابلیت هایی که برنامه نویسان در ورژن قبلی Entity Framework درخواست کرده بودند ولی قابل انجام نبود.پشتیبانی از برنامه هایی که به صورت کامل از دات نت فریم ورک استفاده می کنند شبیه WPF و ASP.NET و غیره.Entity Framework 7 دقیقا شبیه ASP.NET 5 عرضه خواهد شد و می توان از آن در برنامه های تحت وب به راحتی استفاده کرد.

*کد نویسی مشابه، کد بیس* *(Code Base)** جدید*
 اگر به نسخه ی ششم از Entity Framework  نگاه کنیم (به خصوص ورژن Ninja) خواهیم دید که بسیاری از ویژگی های جدید  به API مربوطه اضافه شد. برای مثال، انجام عملیات ناهمگام (Asynchronous)  در بانک های اطلاعاتی، دسترسی به پایپ لاین کوئری ها، تغییرات در روش Code  First و بسیاری موارد دیگر از این دسته اند. این موضوع نشانگر این است که  با هر ورژن جدید از Entity Framework ویژگی های جدید و تکنیک هایی برای  افزایش کارایی نیز معرفی می شود. یکی از موضوعات مهم در ساخت ورژن هفتم از Entity Framework پیاده سازی مسائلی بود که با Code Base سابق Entity Framework قابل انجام نبود. با ایجاد تغییر در Code Base ورژن هفتم از Entity Framework،  این قابلیت ها اضافه شد. اینکه ورژن هفتم از Entity Framework باید به  عنوان یک تکنولوژی دسترسی به داده (Data Access Technology) جدید معرفی شود  و یا اینکه به عنوان ورژن جدید Entity Framework عرضه شود نیز تصمیمی بوده  که کارکنان مایکروسافت در آن اختلاف نظر داشته اند. آنها حتی به این فکر  کرده اند که ورژن هفتم را به عنوان Entity Framework Light معرفی کنند ولی  در نهایت، این تکنولوژی جدید که Code Base کاملاً مورد تغییر قرار گرفته  است به عنوان Entity Framework 7 معرفی شده است.


*نگهداشتن قابلیت های قبلی*
 بدون شک با انجام هر به روز رسانی در هر تکنولوژی و برنامه ای، قسمت های  جدیدی اضافه و قسمت هایی حذف می شوند. Entity Framework 7 نیز از این  قاعده مستثنا نیست. در ورژن هفتم از Entity Framework  نیز قسمت هایی اضافه خواهند شد و قسمت هایی که در نسخه های قبلی کمتر مورد  استفاده قرار می گرفتند، حذف می شوند. در Entity Framework 7 هنوز می  توانید از کلاس های DbContext، DbSet استفاده کنید. به علاوه پرس و جوهای LINQ و استفاده از 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("Ve  rmont"));
}





 همانطور که گفته شد با هر آپدیتی قسمت هایی از برنامه که کمتر مورد  استفاده قرار می گرفتند حذف شده و قسمت های جدید اضافه می شوند. در ورژن  هفتم از Entity Framework  نگاشت (Mapping) پیچیده نیز حذف شده اند. این موضوع اغلب به دلیل پیاده  سازی قابلیت های جدید است که برنامه نویسان تقاضا کرده اند. بنابراین، در  نسخه ی هفتم از Entity Framework تغییراتی را مشاهده خواهیم کرد. با این  وجود بیشتر ویژگی های پیشین یه قوت خود باقی می مانند.


*حذف* *EDMX** و ادامه ی* *Database First*
 همانطور که بسته ی جامع آموزش Entity Framework 5  گفته شد، سه روش متفاوت برای شروع به کار با تکنولوژی Entity Framework در  برنامه وجود دارد: Model First، Database First، Code First. جالب است که  بدانید در نسخه ی هفتم از Entity Framework از روش Model First پشتیبانی  نمی شود. به عبارت دیگر، در نسخه ی جدید از Entity Framework شما نمی  توانید مدل خود را ایجاد کنید تا برنامه بر اساس فایل XML تولید شده کلاس های POCO و Context را برای شما ایجاد کند.
 روش Code First همچنان پشتیبانی می شود. در این روش، شما کلاس های  Entity خود را در قالب کلاس های POCO ایجاد می کنید و پس از آن Entity  Framework با استفاده از این کلاس های مدل برنامه را در حافظه ساخته و در  نهایت بانک اطلاعاتی مورد نظر را ایجاد می کند. برخی از برتری های این روش  سریع بودن آن، انعطاف پذیری و تمیز تر ماندن پروژه (عدم اضافه شدن فایل های  اضافی) به برنامه است. این روش در ساخت برنامه های ASP.NET MVC بسیار کاربرد دارد. (در بسته ی آموزش مقدماتی ASP.NET MVC ما از این روش برای ساخت برنامه ی تحت وبی استفاده کرده ایم.)
 با این وجود، اگر به استفاده از واسط کاربری Entity Framework در روش  Model First عادت کرده اید، برنامه های جایگزینی هستند که می توانند این  کار را برای شما انجام دهند. برای مثال، LLBLGen Pro Designer و Devart  Entity Developer دوتا از برنامه هایی هستند که می توانید برای کار با  Entity Framework در روش Model First از آنها استفاده کنید.


*ردپای کمتر، دستگاه ها و سیستم عامل های بیشتر*
 یکی از اهداف مایکروسافت در روند توسعه ی Entity Framework 7 کم کردن  تعداد DLL هایی است که کاربر برای کار به آنها نیاز دارد. در نسخه های قبلی  از Entity Framework  این موضوع مورد توجه قرار نگرفته بود. در نسخه ی هفتم شما برای هر کاری  فقط به تعداد کمی DLL نیاز دارید. برای مثال، اگر می خواهید از Entity  Framework در کار با بانک های اطلاعاتی SQL Server استفاده کنید، نیاز به  EntityFramework.dll، DLL مربوط به SQL Server و یک DLL برای کار با بانک  های اطلاعاتی رابطه ای دارید. اگر می خواهید از Migration استفاده کنید،  نیاز به DLL متفاوتی دارید که می توانید در شروع کار آن را در نظر نگیرید.  به علاوه، مایکروسافت سعی کرده است که این DLL ها از طریق NuGet در قالب یک  سری NuGet Package معرفی کند که این موضوع کار را بیش از پیش راحت می کند.
 این روش مزیت دیگری نیز دارد. Entity Framework  دیگر به نسخه ی کامل دات نت فریم ورک وابسته نیست و دستگاه هایی که از  Mono استفاده می کنند نیز می توانند از Entity Framework استفاده کنند.  برای مثال، می توانید از Entity Framework در Linux استفاده کنید. سیستم عامل Mac و دستگاه های Windows Phone نیز می توانند یک گزینه های دیگر باشند.


*فراتر از بانک های اطلاعاتی رابطه ای*
 از ابتدای کار، مایکروسافت در نظر داشت که Entity Framework را طوری  طراحی کند که برای گستره ی وسیعی از بانک های اطلاعاتی مورد استفاده قرار  بگیرد. در زمان معرفی Entity Framework بانک های اطلاعاتی غیر رابطه ای به  وسعت امروزه نبودند. امروزه بانک های اطلاعاتی شبیه NoSQL که یک بانک  اطلاعاتی غیر رابطه ای است بسیار محبوب شده اند. دقت کنید که Entity Framework  یک ORM است و این کلمه به معنی Object Relational Mapper می باشد. به کلمه  ی Relational که دلالت بر بانک های اطلاعاتی رابطه ای دارد دقت کنید. با  تمامی این موضوع ها، Entity Framework 7 به صورت سطح بالا از کار با بانک  های اطلاعاتی غیر رابطه ای پشتیبانی می کند. لطفاً دقت کنید که گفته شد یک  پشتیبانی سطح بالا: بین بانک های اطلاعاتی رابطه ای و غیر رابطه ای تفاوت  های زیادی وجود دارد که 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  از این موضوع صحبت شده است.) کار کردن با داده های Disconnected نیز یکی  دیگر از موضوع های مهم در توسعه ی Entity Framework 7 بوده است. این موضوع  اغلب برای برنامه نویسان دردسر ساز است که سعی شده است در نسخه ی هفتم از Entity Framework به صورت دقیق تر و تمیزتر پیاده سازی شود.
 به علاوه، استفاده کردن از بانک های اطلاعاتی غیر رابطه ای شبیه Azure یکی دیگر از تلاش های مایکروسافت برای توسعه ی Entity Framework بوده است.
 با تمام صحبت هایی که در این آموزش در وبسایت پرووید گفته شد، قابلیت  های بیشتری در نسخه ی هفتم از Entity Framework وجود دارد که جای بحث و  صحبت داشته باشد. بهتر است صبر کنیم و ببینیم مایکروسافت این بار قرار است  چگونه همه ی ما را شگفت زده کند.

----------

