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































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