آموزش Backing Fields در EF Core

در آموزش Backing Fields در EF Core و Asp.net Core به برسی این که Backing Field چیست ؟ میپردازیم و همچنین به صورت عملی آن را پیاده سازی میکنیم.

تعلریف مختلف از Backing Fields

در این بخش توضیح میدهیم که Backing Field چیست ؟

  • تعریف ۱: Backing Field یعنی یک متغیر پنهانی داخل کلاس که مقدار اصلی یک property رو نگه می‌داره. بیرون کلاس فقط می‌تونیم مقدارش رو بخونیم، ولی نمی‌تونیم تغییرش بدیم، مگر از داخل خود کلاس.
  • تعریف ۲: Backing Field فیلدی هست که پشت یک property کار می‌کنه. این فیلد معمولاً private هست و مستقیماً قابل دسترسی نیست. کنترل مقداردهی property فقط از طریق متدهای کلاس انجام می‌شه.
  • تعریف ۳: Backing Field یک فیلد خصوصی در کلاس است که مقدار واقعی یک property را ذخیره می‌کند. این روش به ما اجازه می‌دهد تا تغییر مقدار property فقط از داخل کلاس (و تحت شرایط خاص) انجام شود، در حالی که سایر بخش‌های برنامه فقط اجازه‌ی خواندن مقدار را دارند.
  • تعریف ۴: Backing Field تکنیکی در شی‌ء‌گرایی برای پیاده‌سازی encapsulation است که از طریق آن مقداردهی و تغییر propertyها فقط از داخل کلاس انجام می‌شود و property فقط یک واسط readonly به بیرون ارائه می‌دهد.

کاربرد اصلی Backing Field در EF Core:

  • جلوگیری از دسترسی مستقیم به property توسط EF
  • پیاده‌سازی منطق خاص در getter و setter بدون تأثیر در رفتار EF
  • کنترل بیشتر بر روی تغییرات داده‌ها (مثل اعتبارسنجی، لاگ‌برداری، تاریخچه و…)
  • تغییر فیلد فقط توسط خود Entity (Encapsulation کامل)

پروژه عملی Backing Fields در Entity Framework Core

مدل اولیه

public int Id { get; set; }
public string FName { get; set; }
public string LName { get; set; }
public string NCode { get; set; }
public DateTime RegisterDate { get; set; }
public bool IsActive { get; set; }

پیاده سازی Backing Fields در EF Core

پیاده سازی Backing Fields در EF Core نکته اول

متد Setter همه پراپرتی ها باید به صورت private set تعربف شود. اگر برای همه فیلدها Backing Field قرار نیست تعریف کنیم. حداقل کاری که میتوان انجام داد. اینه که set اون رو خصوصی (private set) تعریف کنم. پراپرتی‌هایی که از Backing Field استفاده نمی‌کنند، باید حداقل private set داشته باشند تا از تغییر مستقیم از بیرون جلوگیری شود و فقط از طریق منطق داخلی کلاس مقداردهی شوند.

public int Id { get; private set; }
public string FName { get; private set; }
public string LName { get; private set; }
public string NCode { get; private set; }
public DateTime RegisterDate { get; private set; }
public bool IsActive { get; private set; }

پیاده سازی Backing Fields در EF Core نکته دوم

برای نمایش اجباری یا اختیاری بودن پراپرتی ها به این روش عمل کنید. اگر احتیاری بود میتوانید از همان ? استفاده کنید. اما گر اجباری بود نباید از مقدار Required استفاده کنید و مانند جدول زیر عمل شود.

public int Id { get; private set; }
public string FName { get; private set; } = default!;
public string LName { get; private set; } = default!;
public string? NCode { get; private set; }
public DateTime RegisterDate { get; private set; } = DateTime.UtcNow;
public bool IsActive { get; private set; } = false
نوع فیلداجباری بودننحوه نوشتن
stringاجباریpublic string Name { get; private set; } = default!;
stringاختیاریpublic string? Bio { get; private set; }
intاجباریpublic int Age { get; private set; }
intاختیاریpublic int? Height { get; private set; }
boolاجباریpublic bool IsActive { get; private set; } = false;
boolاختیاریpublic bool? EmailConfirmed { get; private set; }
DateTimeاجباریpublic DateTime CreatedAt { get; private set; } = DateTime.UtcNow;
DateTimeاختیاریpublic DateTime? Birthday { get; private set; }
  • اجباری بودن = بدون ? + مقداردهی اولیه اگر نیاز باشه.
  • اختیاری بودن = با ? و بدون نیاز به مقداردهی اولیه.
  • فقط در مورد string نیاز به default! هست، چون nullable reference type هست.

پیاده سازی Backing Fields در EF Core نکنه سوم

Backing Field باید حتماً private یا در موارد خاص protected باشه. اسم Backing Field باید با _ شروع بشه و نزدیک‌ترین نام به property باشه.

public int Id { get; private set; }
public string FName { get; private set; } = default!;
public string LName { get; private set; } = default!;
public string? NCode { get; private set; }
public DateTime RegisterDate => _registerDate;
public bool IsActive => _isActive;
private DateTime _registerDate = DateTime.UtcNow;
private bool _isActive = false;

پیاده سازی Backing Fields در EF Core نکته چهارم

حداقل به ۲ constructor – سازنده نیاز داریم.

  • یک – Constructor بدون پارامتر (پیش‌فرض) برای EF Core csharp Copy Edit : حتما private باشد. EF Core هنگام بارگذاری داده از دیتابیس، نیاز به سازنده بدون پارامتر دارد.
  • دو – Constructor عمومی (با پارامتر) برای استفاده در منطق دامین و Insert : این سازنده برای ساخت شیء جدید در منطق برنامه (مثل هنگام ثبت در فرم) استفاده می‌شود . و تمام اعتبارسنجی‌ها و مقداردهی‌های منطقی در همین constructor انجام می‌شود.
private Programer() { }

public Programer(string fName, string lName, string? nCode)
{
    FName = fName;
    LName = lName;
    NCode = nCode;
    _isActive = CheckNCode(nCode);
}

private static bool CheckNCode(string? NCode)
{
    if (string.IsNullOrWhiteSpace(NCode))
        return false;

    if (NCode.Length != 10 || !NCode.All(char.IsDigit))
        return false;

    return true;
}

پیاده سازی Backing Fields در EF Core نکته پنجم

حداقل یک متد برای ویرایش یا بروزرسانی اطلاعات اصلی نیاز داریم. بهتر است نام آن UpdateIdentity باشد.

public void UpdateIdentity(string fName, string lName, string? nCode)
{
FName = fName;
LName = lName;
NCode = nCode;
_isActive = CheckNCode(nCode);
}

پیاده سازی Backing Fields در EF Core نکته ششم

تنظیمات Backing Field با Fluent API

modelBuilder.Entity<Programer>()
    .Property<DateTime>("_registerDate")
    .HasColumnName(nameof(Programer.RegisterDate))
    .IsRequired();

modelBuilder.Entity<Programer>()
    .Property<bool>("_isActive")
    .HasColumnName(nameof(Programer.IsActive))
    .HasDefaultValue(false)
    .IsRequired();

پیاده سازی Backing Fields در EF Core نکته هفتم

از AutoMapper در Backing Field میتوان برای مپ کردن همه موارد غیر Update استفاده کرد. و حتی در Update میتوان توسط AutoMapper فرم ویرایش را هم نمایش داد. ولی تبدیل اطلاعات فرم که یک ویو مدل است به Model اصلی امکانپذیر نیست. چون باید از متد آپدیت استفاده کرد.

CreateMap<Programer, ProgramerViewModel>();
CreateMap<ProgramerInsertViewModel,Programer>()
.ConstructUsing(x => new Programer(x.FName, x.LName, x.NCode));
CreateMap<Program, ProgramerUpdateViewModel>();

مشاهده در آپارات یا یوتیوب

محتوای ویدیویی این صفحه در سایت قابل مشاهده است. اما اگر عادت دارید توی پلتفرم آپارات یا یوتیوب ویدیوها را مشاهده کنید، می‌توانید از دکمه‌های زیر استفاده کنید.

تماشای ویدیوی آموزش Backing Fields در EF Core در آپارات و یوتیوب

اشتراک‌گذاری با یک کلیک

با یک کلیک، محتوای این صفحه را در شبکه‌های اجتماعی، ایمیل یا پیام‌رسان‌های مورد علاقه‌تان به‌سرعت به اشتراک بگذارید.

اشتراک‌گذاری صفحه آموزش Backing Fields در EF Core در شبکه‌های اجتماعی

نظرات شما برای ما ارزشمند است

متاسفانه تاکنون پیامی برای این مطلب ثبت نشده است. شما اولین شخصی باشید که پیام می‌گذارد.

نظرات کاربران

فرم افزودن دیدگاه

با ارسال نظرات خود ما را در ایجاد محتوای بهتر کمک کنید.

با خدمات تهران آی تی آشنا شوید

تهران آی تی با افتخار خدمات زیر را ارائه می‌دهد.