Aida-Hagh / EF-Core

Learn EF Core
1 stars 0 forks source link

Value Conversions #18

Open Aida-Hagh opened 4 months ago

Aida-Hagh commented 4 months ago

با این ویژگی میتوانیم نوع داده‌ای که در مدل دامین استفاده می‌کنیم را به نوع داده‌ای که در پایگاه داده ذخیره می‌شود تبدیل کنیم. مثال: تبدیل bool به int برای مثال یک مدل ساده داریم که شامل یک ویژگی IsActive است که به صورت bool تعریف شده است ولی می‌خواهیم آن را به عنوان یک int در پایگاه داده ذخیره کنیم.با استفاده از کلاس ValueConverter بصورت زیر مینویسیم.

public class MyEntity {

public int Id { get; set; }
public bool IsActive { get; set; }

}


using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Storage.ValueConversion;

public class MyDbContext : DbContext {

public DbSet<MyEntity> MyEntities { get; set; }

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    var boolToIntConverter = new ValueConverter<bool, int>(
        v => v ? 1 : 0,
        v => v == 1);

    modelBuilder.Entity<MyEntity>()
        .Property(e => e.IsActive)
        .HasConversion(boolToIntConverter);
}

}

در این مثال: v => v ? 1 : 0 بیان لامبدا برای تبدیل bool به int است. v => v == 1 بیان لامبدا برای تبدیل int به bool است.


استفاده از Value Conversion با Data Annotations تبدیل DateTime به long: اگر بخواهید یک DateTime را به یک long (تعداد تیک‌ها از تاریخ مبنا) تبدیل کنید و بالعکس:

protected override void OnModelCreating(ModelBuilder modelBuilder) {

var dateTimeToTicksConverter = new ValueConverter<DateTime, long>(
    v => v.Ticks,
    v => new DateTime(v));

modelBuilder.Entity<MyEntity>()
    .Property(e => e.CreatedDate)
    .HasConversion(dateTimeToTicksConverter);

}


تبدیل string به EncryptedString می‌توانیم رشته‌ها را قبل از ذخیره‌سازی رمزنگاری کنیم و بعد از بازیابی رمزگشایی کنیم. برای این کار، ابتدا به یک تابع رمزنگاری نیاز داریم:

public static class Encryptor {

public static string Encrypt(string plainText)
{
    // پیاده‌سازی رمزنگاری
    return Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(plainText));
}

public static string Decrypt(string encryptedText)
{
    // پیاده‌سازی رمزگشایی
    return System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(encryptedText));
}

}

protected override void OnModelCreating(ModelBuilder modelBuilder) {

var stringToEncryptedStringConverter = new ValueConverter<string, string>(
    v => Encryptor.Encrypt(v),
    v => Encryptor.Decrypt(v));

modelBuilder.Entity<MyEntity>()
    .Property(e => e.SensitiveData)
    .HasConversion(stringToEncryptedStringConverter);

}