معرفی و نحوه استفاده از Value Conversions

نکته : 

این امکان در EF Core 2.1 اضافه شده است .

Value Conversion ها به شما این اجازه را میدهند که value  یک Property را هنگام Read وWrite کردن از دیتابیس تبدیل کنید . به عنوان مثال ذخیره کردن enums  به عنوان رشته در دیتابیس .

تبدیل با استفاده از Func experssion trees انجام می شود .
 
به عنوان مثال کلاس Post را به همراه Enum آن میسازیم 
public class Rider
{
    public int Id { get; set; }
    public EquineBeast Mount { get; set; }
}

public enum EquineBeast
{
    Donkey,
    Mule,
    Horse,
    Unicorn
}

و برای این تبدیل باید به OnModelCreating در DbContext مراجعه کرده و اینکار به صورت زیر انجام دهید .

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder
        .Entity<Rider>()
        .Property(e => e.Mount)
        .HasConversion(
            v => v.ToString(),
            v => (EquineBeast)Enum.Parse(typeof(EquineBeast), v));
}

نکته : 

Value Conversion ها هرگز مقدار null نمیگیرند . 

 همچنین می نوانید یک نمونه از Value Conversion بسازید و آن ازاستفاده کنید . 

var converter = new ValueConverter<EquineBeast, string>(
    v => v.ToString(),
    v => (EquineBeast)Enum.Parse(typeof(EquineBeast), v));

modelBuilder
    .Entity<Rider>()
    .Property(e => e.Mount)
    .HasConversion(converter);

این امکان زمانی بکار گرفته می شود که میخواهید چندین ویژگی از همان تبدیل را استفاده کنید .

نکته : 
در حال حاضر راهی وجود ندارد که در یک مکان مشخص به هر Property از یک نوع خاص بتوانید یک  Value Conversion را اعمال کنید . و این ویژگی احتمالا در نسخه های بعدی در نظر گرفته خواهد شد .

 مبدل های توکار و داخلی

یک سری Value Conversion های توکار در EF Core در namespace زیر 
Microsoft.EntityFrameworkCore.Storage.ValueConversion

 وجود دارد که لیست این Value Conversion را متوانید از اینجا مشاهده کنید .

توجه کنید که EnumToStringConverter در این لیست وجود دارد و نیازی به تعیین صریح تبدیل نیست میتوانید فقط از مبدل داخلی به صورت زیر استفاده کنید :

var converter = new EnumToStringConverter<EquineBeast>();

modelBuilder
    .Entity<Rider>()
    .Property(e => e.Mount)
    .HasConversion(converter);

محدودیت ها :

همانطور که در بالا ذکر شد ، null قابل تبدیل نیست.
در حال حاضر هیچ راهی برای پخش تبدیل یک خاصیت به چندین ستون یا برعکس وجود ندارد.
استفاده از Value Conversion ها ممکن است در ترجمه عبارت ها  بهSQL مشکلی به وجود آورد و اخطاری برای چنین مواردی مشاهده کنید .  حذف این محدودیت ها برای نسخه بعدی در نظر گرفته شده است.