در آموزش Backing Fields در EF Core و Asp.net Core به برسی این که Backing Field چیست ؟ میپردازیم و همچنین به صورت عملی آن را پیاده سازی میکنیم.
در این بخش توضیح میدهیم که Backing Field چیست ؟
مدل اولیه
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 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; }
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 هست.
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 بدون پارامتر (پیشفرض) برای 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;
}
public void UpdateIdentity(string fName, string lName, string? nCode)
{
FName = fName;
LName = lName;
NCode = nCode;
_isActive = CheckNCode(nCode);
}
modelBuilder.Entity<Programer>()
.Property<DateTime>("_registerDate")
.HasColumnName(nameof(Programer.RegisterDate))
.IsRequired();
modelBuilder.Entity<Programer>()
.Property<bool>("_isActive")
.HasColumnName(nameof(Programer.IsActive))
.HasDefaultValue(false)
.IsRequired();
CreateMap<Programer, ProgramerViewModel>();
CreateMap<ProgramerInsertViewModel,Programer>()
.ConstructUsing(x => new Programer(x.FName, x.LName, x.NCode));
CreateMap<Program, ProgramerUpdateViewModel>();