آموزش Code First Data Annotations
بسم الله الرحمن الرحیم
برای مشاهده بخش های دوره آموزش Code First Data Annotations از طریق لینکهای زیر اقدام نمایید.
آموزش Code First
Data Annotations
در طراحی پایگاه داده به وسیله Entity Framework در MVC برای مشخص کردن خصوصیت های جداول و فیلدها می بایست از خاصیتی به نام Data Annotations استفاده کنید. کار با این خصوصیت بسیار ساده می باشد.
ما دو کلاس را برای پروژه خود نیاز داریم، این دو کلاس را با نام های Blog.cs و Post.cs در فولدر Model پروژه MVC خود ایجاد می کنیم و کد های زیر را در آن ها قرار می دهیم.
public class Blog
{
public int Id { get; set; }
public string Title { get; set; }
public string BloggerName { get; set;}
public virtual ICollection<Post> Posts { get; set; }
}
public class Post
{
public int Id { get; set; }
public string Title { get; set; }
public DateTime DateCreated { get; set; }
public string Content { get; set; }
public int BlogId { get; set; }
public ICollection<Comment> Comments { get; set; }
}
Key
تعیین کلید اصلی جداول
Entity Framework برای ایجاد کلید اصلی جدول شما در دیتابیس، در مدلی که طراحی کردید به دنبال نام Id و یا نام کلاس شما به علاوه کلمه Id (مثلا BlogId) می گردد، هر یک از این دو پراپرتی در صورتی که در کلاس شما وجود داشته باشد تبدیل به کلید اصلی در جدول پایگاه داده می شود.
در صورتی که هیچ یک از این دو کلمه در کلاس مدل شما وجود نداشته باشد Entity Framework یکexception برای این مورد throw می کند. برای حل این مشکل کافی است از خاصیتی به نام [Key]در بالای فیلد کلید خود استفاده کنید.
مثلا ما می خواهیم در اینجا نام کلید اصلی خود راPrimaryTrackingKey قرار دهیم پس باید کد خود را به صورت زیر تغییر دهیم.
public class Blog
{
[Key]
public int PrimaryTrackingKey { get; set; }
public string Title { get; set; }
public string BloggerName { get; set;}
public virtual ICollection<Post> Posts { get; set; }
}
اگر شما از Entity Framework و روش Code First برای ایجاد دیتابیس استفاده کنید، جدول Blog یک کلید اصلی با نام PrimaryTrackingKey
خواهد داشت که به صورت پیش فرض Identity تعریف خواهد شد
Composite keys
کلیدهای ترکیبی
ممکن است شما بخواهید برای جدول خود دو فیلد را باهم به عنوان یک کلید اصلی در نظر بگیرید:
مثلا در اینجا ما می خواهیمPassportNumber را باIssuingCountry به عنوان کلید اصلی جدول خود در نظر بگیریم. برای اینکار باید شما در بالای هر دو پراپرتی خود خاصیت [Key] را قید کنید:
public class Passport
{
[Key]
public int PassportNumber { get; set; }
[Key]
public string IssuingCountry { get; set; }
public DateTime Issued { get; set; }
public DateTime Expires { get; set; }
}
اگر شما برای اجرای این دستور یک InvalidOperationExceptions دریافت کردید شاید به این دلیل باشد که Entity Framework نمی داند ترتیب اجرای این دستورات به چه صورتی است، بدین منظور که وقتی شما دو پراپرتی را به عنوان کلید در نظر می گیرید Entity Framework باید ترتیب این دو پراپرتی را برای ایجاد کلید اصلی بداند.
مثال
اگر مقدار پراپرتی اول شما(PassportNumber) 200 باشد و مقدار پراپرتی دوم شما(IssuingCountry) 350 باشد. کلید شما می تواند 200350 باشد یا 350200، Entity Framework باید بداند کدام کلید را اول و کدام را دوم قرار دهد:
public class Passport
{
[Key]
[Column(Order=1)]
public int PassportNumber { get; set; }
[Key]
[Column(Order = 2)]
public string IssuingCountry { get; set; }
public DateTime Issued { get; set; }
public DateTime Expires { get; set; }
}
Required
برای اجباری کردن پراپرتی ها می توانید به صورت زیر عمل کنید
[Required]
public string Title { get; set; }
این دستور باعث می شود که فیلد شما در پایگاه داده به non-nullable تبدیل شود
MaxLength and MinLength
این دو خاصیت این امکان را به شما می دهند تا حداقل و حداکثر مجاز برای وارد کردن داده در این فیلد را معین کنید:
[MaxLength(10),MinLength(5)]
public string BloggerName { get; set; }
MaxLength annotation بر روی دیتابیس نیز تاثیر می گذارد و باعث می شود که حداکثر طول این فیلد بر اساس مقداری که شما وارد کرده اید تغییر کند.
شما می توانید به وسیله data annotation پیغام خطایی را برای هر خاصیت فیلد تعیین کنید تا درصورتی که مقداری معتبر وارد نشد، پیغام شما به کاربر نمایش داده شود:
[MaxLength(10, ErrorMessage="BloggerName must be 10 characters or less"),MinLength(5)]
public string BloggerName { get; set; }
NotMapped
تمامی فیلدهایی که شما در Model خود تعریف می کنید در دیتابیس نیز اضافه می شود، ممکن است شما فیلدی را بخواهید در Model خود تعریف کنید که نیاز به ذخیره شدن در دیتابیس نداشته باشد، برای این کار می تواند از خاصیت[NotMapped] استفاده کنید:
[NotMapped]
public string BlogCode
{
get
{
return Title.Substring(0, 1) + ":" + BloggerName.Substring(0, 1);
}
}