Entity Framework Core 2.2 منتشر شد

دیروز نسخه نهایی Entity Framework Core 2.2 به همراه ASP.NET Core 2.2 و ‎.Net Core 2.2 منتشر شد. این انتشار، جدیدترین ارائه ORM اوپن سورس و چند سکوئی مایکروسافت است.

Entity Framework Core 2.2 حاوی بیش از 100 رفع اشکال نسبت به نسخه قبلی، و نیز قابلیت های جدید بسیار است.

پشتیبانی از Spatial Data

شما می توانید از Spatial Data برای نشان دادن موقعیت فیزیکی و شکل اشیاء استفاده کنید. بسیاری از دیتابیس ها می توانند این گونه داده ها را نگهداری، و ایندکس گذاری کرده و از آنها Query بگیرند. رایج ترین سناریو استفاده از این داده ها شامل کوئری گرفتن از آبجکت هایی است که فاصله مشخصی با مقدار مورد نظر شما دارند، و یا در محدوده چند ضلعی ای که شما مشخص کرده اید قرار دارند. EF Core 2.2 هم اکنون کار کردن با Spatial Data که ممکن است در انواع دیتابیس های مختلفی نگهداری شده باشد را با استفاده از Type های موجود در کتابخانه NetToplogySuite (معروف به NTS) پشتیبانی می کند.

پشتیبانی از Spatial Data در قالب یک سری از Extension Package های ویژه کار با Provider ها پیاده سازی شده است. هر یک از این پکیج ها Mapping لازم بین Type و Method های موجود در NTS و نوع داده ها و تابع های موجود در دیتابیس خاصی را ارائه می کند. به عنوان نمونه این Provider ها می توان به پکیج های ارائه شده برای SQL Server ، ‏SQLite ، و ‏PostgreSQL (از پروژه Npgsql) اشاره کرد. از نوع داده های Spatial می توان به صورت مستقیم با استفاده از EF Core in-memory provider بدون نیاز به هیچ پکیج اضافی ای استفاده کرد.

زمانی که افزودن Provider نصب شد می توانید Property های Type های پشتیبانی شده را به Entity تان بیافزایید. به عنوان مثال:

using NetTopologySuite.Geometries;

namespace MyApp
{
  public class Friend
  {
    [Key]
    public string Name { get; set; }

    [Required]
    public Point Location { get; set; }
  }
}

شما می توانید Entity ها را به همراه داده های Spatial در دیتابیس یا Storage مورد نظرتان ذخیره کنید:

using (var context = new MyDbContext())
{
    context.Add(
        new Friend
        {
            Name = "Bill",
            Location = new Point(-122.34877, 47.6233355) {SRID = 4326 }
        });
    context.SaveChanges();
}

همچنین می توانید کوئری های مبتنی بر دیتابیس را بر اساس داده های Spatial اجرا کنید:

  var nearestFriends =
      (from f in context.Friends
      orderby f.Location.Distance(myLocation) descending
      select f).Take(5).ToList();

برای کسب اطلاعات بیشتر به مستندات Spatial Data مراجعه کنید.

کالکشن های Owned Entity

در EF Core 2.0 پشتیبانی از مالکیت مدل (Model Ownership) در رابطه های یک به یک اضافه شد. EF Core 2.2 قابلیت فوق را به شکل یک به چند نیز ممکن کرده است. قابلیت مالکیت (Ownership) برای تعریف قید (Constraint) جهت مشخص کردن نحوه استفاده از Entity ها کمک بزرگی می کند.

به عنوان مثالی از کاربرد Owned Entity ها، می توان چنین حالتی را در نظر گرفت: یک Entity فقط بتواند به عنوان Navigation Property در Entity های دیگر استفاده شود، به صورت خودکار لود شود، و فقط از طریق مالک اش بتواند توسط DbContext ردیابی (Track) شود.

در دیتابیس های رابطه ای (Relational)، کالکشن های Owned به جدول های جداگانه ای نسبت به مالک شان Map می شوند، درست مانند رابطه های یک به چند. اما در دیتابیس های سند گرا (Document Oriented) قرار است که Owned Entity ها (در Owned Collection ها یا Reference ها) در همان Document ای که مالک شان قرار دارد قرار بگیرند.

برای استفاده از این قابلیت کافی است تابع API جدید OwnsMany()‎ را فرخوانی کنید:

modelBuilder.Entity().OwnsMany(c => c.Addresses);

برای کسب اطلاعات بیشتر به مستندات Owned Entities مراجعه کنید.

تگ گذاری Query ها

این قابلیت به شما اجازه می دهد در Query های Linq تگ/کامنت هایی قرار دهید که در دستورات SQL خروجی تولید شده دیده شده و تشخیص کد تولید شده برای Linq Query شما در خروجی را آسان تر کند. برای بهره مندی از قابلیت Query Tag می توانید در Query تان در Linq از متد جدید TagWith()‎ استفاده کنید. به عنوان مثال اگر این متد را به کوئری ای که بالاتر برای داده های Spatial تعریف کردیم به صورت زیر اضافه کنیم:

  var nearestFriends =
      (from f in context.Friends.TagWith(@"This is my spatial query!")
      orderby f.Location.Distance(myLocation) descending
      select f).Take(5).ToList();

چنین خروجی ای در سمت SQL برای ما تولید خواهد شد:

-- This is my spatial query!

SELECT TOP(@__p_1) [f].[Name], [f].[Location]
FROM [Friends] AS [f]
ORDER BY [f].[Location].STDistance(@__myLocation_0) DESC

جهت کسب اطلاعات بیشتر به مستندات Query Tag مراجعه کنید.

روش نصب EF Core 2.2

پکیج های EF Core 2.2 از طریق گالری Nuget در دسترسی هستند. همچنین این پکیج ها به همراه ASP.NET Core 2.2 و نیز ‎.Net Core SDK 2.2 نیز نصب می شوند. به صورت کلی، بهترین روش استفاده استفاده از EF Core در یک برنامه نصب آن از طریق Nuget برای Provider دیتابیس مورد نظر می باشد. به عنوان مثال جهت افزودن پکیج ورژن 2.2 برای SQL Server Provider در یک پروژه ‎.Net Core اجرای دستور زیر در Command Line است:

$ dotnet add package Microsoft.EntityFrameworkCore.SqlServer -v 2.2.0

برای نصب پکیج از طریق کنسول Package Manager در ویژوال استودیو نیز می توانید از دستور زیر استفاده کنید:

PM> Install-Package Microsoft.EntityFrameworkCore.SqlServer -Version 2.2.0

برای کسب اطلاعات بیشتر درباره نحوه افزودن EF Core به پروژه تان به مستندات نصب Entity Framework Core مراجعه کنید.

سازگاری با EF Core 2.1

تیم توسعه EF Core زمان زیادی را برای کسب اطمینان درباره سازگاری EF Core 2.2 با Provider های EF Core 2.1 صرف کرده است و به روزرسانی پکیج EF Core در یک برنامه جهت استفاده از آخرین ورژن آن هیچ مشکلی برای آن برنامه ایجاد نخواهد کرد. انتظار می رود پروسه ارتقاء به آخرین ورژن بدون هیچ مشکلی پیش برود، اما اگر در حین انجام ارتقاء به هر مشکلی برخورد کردید می توانید آن را در Issue Tracker مربوطه مطرح کنید.

ممکن است انجام یک تغییر کوچک جهت استفاده از EF Core 2.2 در کد برنامه شما لازم باشد. برای مطمئن شدن از نیاز به انجام تغییر فوق، این صفحه را مطالعه کنید.

لیست مواردی که به عنوان تغییر در کد جهت استفاده از ورژن های جدید شناخته می شوند در این Issue Tracker مطرح خواهند شد.

در EF Core 3.0 شاهد چه امکانات جدیدی خواهید بود؟

تیم توسعه EF Core پس از ارائه نسخه نهایی EF Core 2.2 بر روی ارائه EF Core 3.0 تمرکز خواهند کرد. هنوز هیچ قابلیت جدیدی اضافه نشده است، بنابراین EF Core 3.0 Preview 1 که هم اکنون در گالری Nuget در دسترس است در حال حاضر فقط حاوی تغییرات داده شده نسبت به EF Core 2.2 می باشد.

در حقیقت، قابلیت ها و امکاناتی که ممکن است در ورژن بعدی ارائه شود هنوز تحت بحث است و اطلاعات بیشتر درباره آنها در اطلاعیه های بعدی اعلام خواهد شد، اما یک سری از مواردی که تا کنون مطرح شده اند عبارتند از:

  • بهبودهای LINQ: استفاده از امکانات LINQ به شما اجازه می دهد بدون نیاز به نوشتن Query به زبان های دیگر، آنها را با زبانی که پروژه تان را انجام می دهید بنویسید و از مزایای وجود Type ها، Intellisense، تابع ها و اپراتورهای فراوان موجود در زبان مورد استفاده تان، و امکان چک شدن Syntax کد در حین کامپایل بهره مند شوید. LINQ شما را قادر می سازد که کوئری های پیچیده متعددی را بنویسید، اما درست اجرا شدن آنها همیشه دردسر بزرگی برای تیم هایی که Provider های LINQ را می نویسند بوده است. در ورژن های اولیه EF Core مشکل به این صورت حل می شد: ابتاده بخش هایی از کوئری که قابل ترجمه به SQL هستند تبدیل به دستورات معادل می شدند، و مابقی اجرای کوئری در حافظه برنامه انجام می شد. این اجرای مابقی کوئری در سمت برنامه در بعضی شرایط مشکلی ایجاد نمی کرد، اما در خیلی از موارد باعث به وجود آمدن Query های ناکارآمد می شد و این ناکارآیی هنگام اجرای برنامه در محیط های عملیاتی (اجرا در سیستم/سازمان مشتری با داده های زیاد) مشخص می شد.
    در EF Core 3.0 قرار است که تغییرات عمیقی در نحوه ترجمه و اجرای LINQ در پشت صحنه داده شود. هدف این است که LINQ بسیار مستحکم تر و قوی تر شود، به عنوان مثال تلاش بر این است که بخش های بیشتری از Query به SQL ترجمه شود.


  •  پشتیبانی از Cosmos DB: کار بر روی ایجاد Cosmos DB Provider برای EF Core در حال انجام است. برنامه نویس هایی که از مدل برنامه نویسی EF استفاده می کنند با بکار گرفتن این Provider به راحتی می توانند از سرویس Cosmos DB ویندوز اَژور  در برنامه های مبتنی بر دیتابیس شان استفاده کنند.هدف از انجام این کار در دسترس قرار دادن مزایای Cosmos DB مانند توزیع Global، سرویس Always On، بعدپذیری Elastic، تاخیرهای کم، و ... حتی بیشتر از گذشته، با استفاده از توابع دات نت است. این Provider امکان استفاده از اکثر قابلیت های EF Core مانند رهگیری خودکار تغییرات (Automatic Change Tracking)، Linq و تغییر مقادیر و تبدیل آنها به SQL API در Cosmos DB را فراهم خواهد کرد. تلاش برای ساخت این Provider قبل از EF Core 2.2 شروع شده بود و هم اکنون ورژن های اولیه و پیش نمایش Provider در دسترس هستند. توسعه این Provider در کنار EF Core 3.0 ادامه خواهد داشت.


  • پشتیبانی از C# 8.0: سعی بر این است که برخی قابلیت های جدید افزوده شده در سی شارپ 8 از جمله Async Stream ها (شامل await foreach) و Nullable Reference Type ها در EF Core قابل استفاده باشد.


  • مهندسی معکوس View های دیتابیس به Type های قابل استفاده در Query ها: در EF Core 2.1 پشتیبانی Query Type ها اضافه شد. این Type ها عمدتا نماینده Query هایی هستند که می توانند داده ها را از دیتابیس بخوانند، اما نمی توان آنها را به روز رسانی کرد. Query Type امکان بسیار مناسبی برای Map کردن View های دیتابیس هستند، به همین دلیل در EF Core 3.0 ایجاد Query Type ها بر اساس View های موجود در دیتابیس به صورت خودکار انجام خواهد شد.


  •  Entity های Property Bag: با استفاده از این قابلیت می توان داده های را به جای Property های عادی در Property های Indexed نگهداری کرد و همچنان از Instance همان Entity برای ارائه Entity Type های مختلف در قالب یک مدل واحد استفاده کرد (یک مثال ساده از این قابلیت، استفاده از یک Type مانند Dictionary<string,object>‎ به عنوان جنس Property است). افزوده شدن این قابلیت یک قدم بزرگ برای پشتیبانی رابطه های چند به چند بدون نیاز به استفاده از Join محسوب می شود و وجود چنین قابلیت در درخواست های متعددی از طرف کاربران مطرح شده است.


  • استفاده از EF Core 6.3 بر روی EF Core: در حال حاضر اپلیکیشن های بسیاری وجود دارند که از نسخه های قبلی EF استفاده می کنند و ارتقاء دادن آنها به جهت سازگاری و استفاده از EF Core نیازمند صرف زمان و انرژی زیادی خواهد بود. به این دلیل، بر روی ورژن بعدی EF 6 تغییراتی انجام خواهد شد که بتواند بر روی ‎.Net Core 3.0 اجرا شود. با استفاده از این امکان ارتقاء دادن اپلیکیشن های موجود نیازمند انجام کمترین تغییرات خواهد بود. البته محدودیت هایی نیز وجود خواهد داشت (از جمله، Provider های جدید میبایست ساخته شود، و استفاده از Spatial در SQL Server میسر نخواهد بود)، و قابلیت های جدیدی به EF 6 افزوده نخواهد شد.

تشکر از شما

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

تگ ها:

Entity Framework 3 Core 4 2.2 3 New Features 4