معرفی و نحوه استفاده از 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 مشکلی به وجود آورد و اخطاری برای چنین مواردی مشاهده کنید . حذف این محدودیت ها برای نسخه بعدی در نظر گرفته شده است.