انتشار نسخه جدید Entity Framework Core 5.0 Preview 5

در این مقاله قابلیت جدید Database collations وcomputed columns و ... را در Preview 5 را بررسی میکنیم .

برای مشاهده Preview های قبلی میتوانید به لینک زیر مراجعه کنید .

انتشار نسخه جدید Entity Framework Core 5.0 Preview 2

انتشار نسخه جدید Entity Framework Core 5.0 Preview 3

انتشار نسخه جدید Entity Framework Core 5.0 Preview 4

پیش نیاز ها

پیش نمایش EF Core 5.0 نیاز به NET Standard 2.1. دارد این به چه معنی است :

EF Core 5.0 در NET Core 3.1. اجرا می شود و نیازی به NET Core 5.0. نیست . و ممکن است در پیش نمایش های آینده و بسته به نحوه تکامل برنامه برای NET Core 5. تغییر کند .
EF Core 5.0 بر روی سیستم عامل های دیگری که از NET Standard 2.1. پشتیبانی می کنند اجرا می شود.
EF Core 5.0 بر روی پلتفرم های  NET Standard 2.0. ، از جمله NET Framework. اجرا نمی شود.

 نحوه دریافت EF Core 5.0 previews

dotnet add package Microsoft.EntityFrameworkCore.SqlServer --version 5.0.0-preview.5.20278.2

قابلیت Database collations

Collation به معنی تطبیق دست خط بوده و در SQL Server وظیفه آن تعیین الگویی برای مرتب‌سازی اطلاعات داخل جداول و ایندکس‌ها می‌باشد.

تنظیم Collation در SQL Server در سه سطح Instance، Database و Field های یک جدول می‌باشد. با تنظیم دقیق Collation می‌توانید مرتب‌سازی و مقایسه (حروف کوچک و بزرگ) درستی در بانک اطلاعاتی خود داشته باشید.

برای درک بهتر این قابلیت در SQL Server توضیحات آقای مسعود طاهری را گوش کنید .

اکنون میتوانید Collation پیش فرض برای Database را در EF Model خود مشخص کنید :

modelBuilder.UseCollation("German_PhoneBook_CI_AS");

سپس برای Database در SQL Server به صورت زیر ایجاد می شود :

CREATE DATABASE [Test]
COLLATE German_PhoneBook_CI_AS;

با استفاده از روش زیر میتوانید برای یک ستون خاص ، Collation را مشخص کنید : 

modelBuilder
     .Entity<User>()
     .Property(e => e.Name)
     .UseCollation("German_PhoneBook_CI_AS");

در آخر با استفاده از ()EF.Functions.Collate اجازه میدهد تا Collation ها را نمایش دهید :

context.Users.Single(e => EF.Functions.Collate(e.Name, "French_CI_AS") == "Jean-Michel Jarre");

کوئری شما به صورت زیر برای SQL Server ترجمه می شود : 

SELECT TOP(2) [u].[Id], [u].[Name]
FROM [Users] AS [u]
WHERE [u].[Name] COLLATE French_CI_AS = N'Jean-Michel Jarre' 

قابلیت No-tracking queries with identity resolution

به عنوان مثال عبارت زیر برای هر پست یک نمونه از بلاگ را ایجاد میکند حتی اگر هر بلاگ دارای همان کلید خارجی باشد :

context.Posts.AsNoTracking().Include(e => e.Blog).ToList();

این کار شاید هزینه ای بیشتری داشته باشد که به اضای هر پست یک بلاگ با آن لود می شود با امکان جدید به صورت زیر میتوانید این اطمینان را داشته باشید که فقط یک نمونه بلاگ ایجاد می شود :

context.Posts.AsNoTracking().PerformIdentityResolution().Include(e => e.Blog).ToList();

نکته :‌ این حالت فقط برای نمایش و درواقع برای حالت بدون ردیابی (no-tracking) یا همان AsNoTracking است . 

قابلیت Stored (persisted) computed columns

Computed Column شامل یک فرمول محاسباتی است .

در صورتی که بخواهیم یک فیلد نتیجه محاسبات را در خود ذخیره کند از Computed Column استفاده میکنیم . زمانی که روی جدولی که دارای Computed Column است عملیات Select را انجام دهیم کلیه محاسبات به ازای تک تک رکورد ها تکرار میگردد و در صورتی که بخواهیم نتیجه محاسبات داخل فیلد ذخیره شود باید نوع آن را Persisted معرفی کنیم این امکان به صورت زیر در EF Core مهیا شده است : 

modelBuilder
    .Entity<User>()
    .Property(e => e.SomethingComputed)
    .HasComputedColumnSql("my sql", stored: true);

همچنین این امکان در SQLite نیز پشتیبانی می شود .