آموزش پیشرفته Data Annotations در EF Core

تهران آی تی / برنامــه نویــسـی / آموزش پیشرفته Data Annotations در EF Core

آموزش پیشرفته Data Annotations در EF Core

آموزش پیشرفته Data Annotations در Entity Framework Core، یکی از راه‌های تعریف ویژگی‌ها و تنظیمات مربوط به مدل‌ها (کلاس‌هایی که نماینده‌ی جدول‌ها در دیتابیس هستند)، استفاده از Data Annotationها یا همان حاشیه‌نویسی‌های داده‌ای است. این Data Annotationها در واقع Attributeهایی هستند که مستقیماً بالای کلاس‌ها یا پراپرتی‌ها نوشته می‌شوند و به EF Core کمک می‌کنند تا بداند:این Data Annotationها در واقع Attributeهایی هستند که مستقیماً بالای کلاس‌ها یا پراپرتی‌ها نوشته می‌شوند و به EF Core کمک می‌کنند تا بداند:

  • کدام پراپرتی کلید اصلی در نظر گرفته شود.
  • کدام فیلدها اجباری (Required) هستند و نمی‌توانند خالی بمانند.
  • طول مجاز فیلدهای متنی چقدر است.
  • نام ستون یا جدول در دیتابیس چه باشد.
  • ارتباط بین جداول (مانند رابطه‌ی کلید خارجی) چگونه برقرار شود.
  • و حتی کدام پراپرتی اصلاً نباید به دیتابیس تبدیل شود.

این روش یک راه ساده، سریع و مستقیم برای تنظیم رفتار مدل‌هاست، بدون این‌که نیازی به استفاده از روش پیچیده‌تر Fluent API داشته باشیم.

پرکاربردترین Data Annotation ها

Attribute توضیح مثال
[Key] تعیین پراپرتی به عنوان کلید اصلی جدول [Key]
public int Id { get; set; }
[Required] الزامی بودن فیلد (NULL نپذیرد) [Required]
public string Name { get; set; }
[StringLength] تعیین حداقل و حداکثر طول مجاز برای رشته [StringLength(50, MinimumLength = 2)]
[MaxLength] تنها تعیین حداکثر طول رشته [MaxLength(100)]
[MinLength] تنها تعیین حداقل طول رشته [MinLength(3)]
[Column] تعیین نام یا نوع ستون در دیتابیس [Column("Full_Name", TypeName = "varchar(100)")]
[Table] تغییر نام جدول پیش‌فرض در دیتابیس [Table("tbl_users")]
[DatabaseGenerated] تعیین نوع تولید مقدار (Identity, Computed, None) [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[ForeignKey] تعیین کلید خارجی به صورت صریح [ForeignKey("UserId")]
[InverseProperty] برای تنظیم روابط دوطرفه در مدل‌های پیچیده [InverseProperty("Orders")]
[NotMapped] از این پراپرتی ستونی در دیتابیس ساخته نشود [NotMapped]
[Timestamp] برای کنترل همزمانی (Concurrency) [Timestamp]
public byte[] RowVersion;
[ConcurrencyCheck] کنترل همزمانی روی یک پراپرتی خاص [ConcurrencyCheck]
[Range] محدود کردن مقدار عددی یا تاریخ بین یک بازه خاص [Range(1, 100)]
[DataType] تعیین نوع داده برای نمایش و اعتبارسنجی [DataType(DataType.Date)]
[EmailAddress] اعتبارسنجی فرمت ایمیل [EmailAddress]
[Phone] اعتبارسنجی شماره تلفن [Phone]
[Url] اعتبارسنجی URL (آدرس اینترنتی) [Url]
[CreditCard] اعتبارسنجی شماره کارت اعتباری [CreditCard]
[RegularExpression] اعتبارسنجی با الگوی regex خاص [RegularExpression(@"^\d{10}$")]
[Compare] مقایسه دو فیلد (مثلاً پسورد و تکرار پسورد) [Compare("Password")]

Data Annotation های پیشرفته در ASP.NET Core و فرم‌ها

Attribute توضیح مثال
[ScaffoldColumn(false)] از نمایش این پراپرتی در صفحات Scaffold یا فرم‌های خودکار جلوگیری می‌کند. [ScaffoldColumn(false)]
public string InternalCode { get; set; }
[BindNever] از Bind شدن این فیلد به فرم ورودی جلوگیری می‌کند (مثلاً فیلدهای سیستمی). [BindNever]
public int AdminId { get; set; }
[BindRequired] الزام می‌کند که فیلد حتماً مقداردهی شود هنگام Bind شدن. [BindRequired]
public string Username { get; set; }
[Display(Name = “…”)] نام نمایشی برای فیلد در فرم‌ها و رابط کاربری تعیین می‌کند. [Display(Name = "Full Name")]
public string Name { get; set; }
[DisplayFormat] فرمت نمایش داده برای فیلد (مثلاً تاریخ، پول، درصد). [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
[Editable(false)] فیلد را فقط خواندنی (read-only) می‌کند در فرم‌ها. [Editable(false)]
public string CreatedBy { get; set; }
[UIHint(“TemplateName”)] برای استفاده از یک قالب (Template) سفارشی در فرم‌ها. [UIHint("MultilineText")]
public string Notes { get; set; }
[HiddenInput(DisplayValue = false)] نمایش فیلد به صورت input hidden در فرم‌ها (ASP.NET MVC). [HiddenInput(DisplayValue = false)]
public int Id { get; set; }

مزایای استفاده از Data Annotation

  • کدنویسی ساده و سریع مناسب برای پروژه‌های سبک یا متوسط.
  • قابل درک برای افراد تازه‌کار.
  • قابل استفاده در کنار Fluent API برای تنظیمات جزئی‌تر.

اگر بخواهیم یک مثال بزنیم، Data Annotation مثل علامت‌هایی است که مستقیم روی دیوار می‌چسبانی تا به بقیه بگویی هر چیزی کجا باید قرار بگیرد — سریع، ساده، و واضح!

RegularExpression های پرکاربرد ایرانی

مورد کد کامل Data Annotation
شماره موبایل ایران
[RegularExpression(@"^09\d{9}$", ErrorMessage = "شماره موبایل باید با ۰۹ شروع شود و دقیقاً ۱۱ رقم باشد.")]
شماره تلفن ثابت ایران
[RegularExpression(@"^0[1-8]{1}[0-9]{1}[0-9]{8}$", ErrorMessage = "شماره تلفن ثابت باید با ۰ و کد شهر شروع شود و ۱۱ رقم باشد.")]
شماره کارت بانکی
[RegularExpression(@"^\d{16}$", ErrorMessage = "شماره کارت بانکی باید دقیقاً ۱۶ رقم باشد.")]
کد ملی ایران
[RegularExpression(@"^\d{10}$", ErrorMessage = "کد ملی باید دقیقاً ۱۰ رقم باشد.")]
شماره شناسنامه
[RegularExpression(@"^\d{1,10}$", ErrorMessage = "شماره شناسنامه باید بین ۱ تا ۱۰ رقم باشد.")]
کد پستی ایران
[RegularExpression(@"^\d{10}$", ErrorMessage = "کد پستی باید دقیقاً ۱۰ رقم باشد.")]
شناسه ملی شرکت
[RegularExpression(@"^\d{11}$", ErrorMessage = "شناسه ملی شرکت باید دقیقاً ۱۱ رقم باشد.")]
شماره حساب بانک ملت
[RegularExpression(@"^\d{13}$", ErrorMessage = "شماره حساب باید دقیقاً ۱۳ رقم باشد.")]
ایمیل با دامنه .ir
[RegularExpression(@"^[\w\.-]+@[\w\.-]+\.(ir)$", ErrorMessage = "ایمیل باید دارای دامنه .ir باشد.")]
فقط حروف فارسی
[RegularExpression(@"^[آ-ی\s]+$", ErrorMessage = "لطفاً فقط از حروف فارسی استفاده کنید.")]
حروف و اعداد فارسی
[RegularExpression(@"^[آ-ی۰-۹\s]+$", ErrorMessage = "فقط حروف و اعداد فارسی مجاز است.")]
شماره پلاک خودرو
[RegularExpression(@"^\d{2}[آ-ی]\d{3}-\d{2}$", ErrorMessage = "شماره پلاک باید به صورت ۱۲الف۳۴۵-۶۷ باشد.")]

مثال عملی Data Annotations

[Table("tbl_user_profiles")] // تغییر نام جدول در دیتابیس
public class UserProfile
{
// کلید اصلی که توسط دیتابیس به‌صورت افزایشی تولید می‌شود
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[HiddenInput(DisplayValue = false)] // در فرم HTML به صورت hidden
public int Id { get; set; }
// فیلد ضروری با حداقل و حداکثر طول مشخص
[Required]
[StringLength(100, MinimumLength = 3)]
[Display(Name = "Full Name")]
public string FullName { get; set; }
// اعتبارسنجی ایمیل
[Required]
[EmailAddress]
[Column(TypeName = "varchar(100)")]
public string Email { get; set; }
// اعتبارسنجی شماره تلفن با regex مخصوص شماره‌های ایرانی
[Required]
[RegularExpression(@"^09\d{9}$", ErrorMessage = "شماره موبایل باید با ۰۹ شروع شود و ۱۱ رقم باشد")]
[StringLength(11, MinimumLength = 11)]
[Display(Name = "Mobile Number")]
public string PhoneNumber { get; set; }
// فیلد آدرس سایت – URL معتبر
[Url]
public string Website { get; set; }
// شماره کارت اعتباری (برای تمرین)
[CreditCard]
[Display(Name = "Credit Card Number")]
public string CreditCard { get; set; }
// سن بین ۱۸ تا ۹۹ سال
[Range(18, 99)]
public int Age { get; set; }
// تاریخ تولد با فرمت خاص نمایش
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime BirthDate { get; set; }
// فیلدی که فقط در کد مقدار می‌گیرد، نه از فرم (BindNever)
[BindNever]
public bool IsAdmin { get; set; }
// فیلدی که باید در فرم ارسال شود، وگرنه خطا می‌دهد
[BindRequired]
public string Username { get; set; }
// فیلد فقط‌خواندنی در فرم
[Editable(false)]
public string CreatedBy { get; set; }
// فیلد محاسباتی که در دیتابیس ذخیره نمی‌شود
[NotMapped]
public string FullNameUpper => FullName?.ToUpper();
// توضیحات بلند با قالب نمایشی چند خطی در فرم
[UIHint("MultilineText")]
public string Bio { get; set; }
// رمز عبور: مقدار اصلی
[Required]
[DataType(DataType.Password)]
[StringLength(100, MinimumLength = 6, ErrorMessage = "رمز عبور باید حداقل ۶ کاراکتر باشد.")]
public string Password { get; set; }
// تکرار رمز عبور: برای مقایسه با رمز اصلی
[Compare("Password", ErrorMessage = "رمز عبور و تکرار آن یکسان نیست.")]
[DataType(DataType.Password)]
[Display(Name = "Confirm Password")]
public string ConfirmPassword { get; set; }
// کنترل همزمانی برای مدیریت تغییرات هم‌زمان رکورد
[Timestamp]
public byte[] RowVersion { get; set; }
// فیلدی که در Scaffold نمایش داده نشود (مثلاً برای سیستم)
[ScaffoldColumn(false)]
public DateTime CreatedAt { get; set; } = DateTime.Now;
}

نکته مهم: در پروژه‌های بزرگ‌تر و پیچیده‌تر Asp.Net Core، معمولاً از Fluent API برای تنظیم دقیق‌تر و منعطف‌تر استفاده می‌شود، ولی Data Annotation همچنان یک ابزار بسیار قدرتمند و کارآمد است برای تنظیمات ابتدایی و متداول.

تفاوت Data Annotation در Model و ViewModel

از Data Annotationها برای اعتبارسنجی، نمایش بهتر فرم‌ها و تنظیم رفتار فیلدها استفاده می‌شود؛ اما جایگاه استفاده آن‌ها بسته به نوع کلاس (Model یا ViewModel) متفاوت است.

در Entity Modelها (مدل‌های EF Core)، Data Annotationهایی مانند [Key], [ForeignKey], [DatabaseGenerated], [Timestamp] و [NotMapped] برای مدیریت ساختار دیتابیس به کار می‌روند.

در مقابل، ViewModelها برای نمایش و دریافت اطلاعات از کاربر طراحی شده‌اند، بنابراین در آن‌ها از Annotationهایی مثل [Required], [StringLength], [Display], [UIHint], [Compare] و [RegularExpression] برای اعتبارسنجی فرم و کنترل ظاهر استفاده می‌شود.

نتیجه: هر جا با دیتابیس سروکار داری، از Data Annotationهای EF استفاده کن؛ و هر جا با فرم کاربر طرف هستی، از Annotationهای مرتبط با UI و Validation در ViewModel استفاده کن.

اگر در پروژه از ViewModel استفاده می‌کنی، همه‌ی Annotationهای مرتبط با فرم، اعتبارسنجی و نمایش UI باید در ViewModel باشن، و همه‌ی Annotationهای مربوط به EF Core و دیتابیس باید فقط در Entity Model باقی بمونن.

Annotation ViewModel Model توضیح
[Required] ✔️ ✔️ اعتبارسنجی الزامی بودن فیلد
[StringLength] ✔️ ✔️ محدود کردن طول رشته (در فرم و در دیتابیس)
[RegularExpression] ✔️ ✔️ فقط در فرم‌ها اعتبارسنجی ساختار خاص مثل موبایل، کد ملی
[Compare] ✔️ مقایسه بین دو فیلد (مثلاً رمز و تکرار)
[Display] ✔️ ✔️ برای UI تغییر نام فیلد در رابط کاربری
[DataType] ✔️ تعیین نوع ورودی برای فرم‌ها (مثلاً ایمیل، تاریخ)
[UIHint] ✔️ نمایش سفارشی فیلد با Template خاص
[HiddenInput] ✔️ مخفی‌کردن فیلد در فرم‌ها
[Key] ✔️ تعیین کلید اصلی در جدول دیتابیس
[DatabaseGenerated] ✔️ مشخص کردن نحوه تولید مقدار (Identity, Computed, None)
[ForeignKey] ✔️ تنظیم کلید خارجی در رابطه بین موجودیت‌ها
[NotMapped] ❌ نیازی نیست ✔️ فیلدهایی که نباید در دیتابیس ذخیره شوند
[Timestamp] ✔️ کنترل همزمانی رکوردها در EF Core

 

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

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

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

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

مطالب مرتبط

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

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

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

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

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

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

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

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