آموزش Backing Fields در EF Core

تهران آی تی / برنامــه نویــسـی / آموزش Backing Fields در EF Core

آموزش 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

  • نکته اول : متد 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; }

  • نکته دوم : برای نمایش اجباری یا اختیاری بودن پراپرتی ها به این روش عمل کنید. اگر احتیاری بود میتوانید از همان ? استفاده کنید. اما گر اجباری بود نباید از مقدار 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 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;

  • نکته چهارم : حداقل به ۲ 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;
}

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

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

  • نکته ششم : تنظیمات 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();

  • نکته هفتم : از 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>();

جستجو کنید
دسترسی سریع
دسته ها

طراحی و پیاده سازی پروژه های طراحی سایت دانشجویی

انجام، اجرا و طراحی پروژه های طراحی سایت برای دانشجویان با HTML CSS PHP ASP.NET JAVA و ... با کمترین هزینه. برای مشاهده نمونه کارها و یا دریافت مشاوره رایگان از تیم طراحی سایت تهران آی تی با ما در تماس باشید. ما بهترین پروژه های طراحی سایت را با حداقل هزینه برای شما طراحی میکنیم - مشاوره رایگان 09121486770

مــشاوره و مشاهده نمونه کارها

مطالب مرتبط

لطفا از مطالب مرتبط با این پست دیدن فرمایید

جــذاب های هفته

از پربازدیدترین مطالب تهران آی تی در هفته ای که گذشت دیدن فرمایید

باورکردنی نیست فقط با 300 هزار تومان

طراحی سایت شما + طراحی اپلیکیشن هدیه و رایگان
این یک حراج است در مدت زمان محدود - شرکت های زیادی سایت های ارزان طراحی میکنند اما آیا کیفیت لازم را دارا هستند؟ طراحی سایت ارزان به همراه اپلیکیشن رایگان هدیه برای اولین بار توسط تهران آی تی مخصوص سازمان ها و کسب و کار های کوچک و بزرگ و حتی جدید تیم طراحی سایت تهران آی تی در کنار شماست تا شناخته شوید - مشاوره رایگان 09121486770

مــشاوره و مشاهده نمونه کارها

پشتیبانی 24 ساعته

تیم تهران آی تی در هفت روز هفته و 24 ساعت روز آماده پاسخ گویی به سوالات کاربران و ارائه مشاره رایگان میباشد