در EF 6 امکان تعریف سادهتر ایندکسها توسط data annotations میسر شدهاست. برای مثال:
در اینجا توسط ویژگی Index، خاصیت آدرس ایمیل به صورت منحصربفرد تعریف شدهاست.
سؤال: چگونه میتوان شبیه به composite keys، اما نه دقیقا composite keys، بر روی چند فیلد با هم ایندکس منحصربفرد تعریف کرد؟
در اینجا جدول رایهای ثبت شدهی یک سیستم را مشاهده میکنید. میخواهیم یک کاربر نتواند بیش از یک رای به یک مطلب خاص بدهد. به عبارتی نیاز است بر روی SectionType (مطلب، اشتراکها، دورهها و ...)، SectionId (شماره مطلب) و UserId (شماره کاربر) یک کلید منحصربفرد ترکیبی تعریف کرد. ترکیب این سه مورد باید در کل جدول منحصربفرد باشند (Multiple column indexes).
همچنین نمیخواهیم Composite key هم تعریف کنیم. میخواهیم Id و Primary key این جدول مانند قبل برقرار باشد.
انجام چنین کاری در EF 6.1 به نحو ذیل میسر شدهاست:
نکتهی انجام اینکار، تعریف Indexها با یک نام یکسان صریحا مشخص شدهاست. در اینجا سه ایندکس تعریف شدهاند؛ اما نام آنها یکی است و مساوی IX_Single_UserRating قرار داده شدهاست. هر سه مورد نیز IsUnique تعریف شدهاند و Order آنها نیز باید مشخص گردد.
خروجی SQL چنین تنظیمی به صورت زیر است:
public abstract class BaseEntity { public int Id { get; set; } } public class User : BaseEntity { [Index(IsUnique = true)] public string EmailAddress { get; set; } }
سؤال: چگونه میتوان شبیه به composite keys، اما نه دقیقا composite keys، بر روی چند فیلد با هم ایندکس منحصربفرد تعریف کرد؟
public class UserRating : BaseEntity { public VoteSectionType SectionType { set; get; } public double RatingValue { get; set; } public int SectionId { get; set; } [ForeignKey("UserId")] public virtual User User { set; get; } public int UserId { set; get; } }
همچنین نمیخواهیم Composite key هم تعریف کنیم. میخواهیم Id و Primary key این جدول مانند قبل برقرار باشد.
انجام چنین کاری در EF 6.1 به نحو ذیل میسر شدهاست:
public class UserRating : BaseEntity { [Index("IX_Single_UserRating", IsUnique = true, Order = 1)] //کلید منحصربفرد ترکیبی روی سه ستون public VoteSectionType SectionType { set; get; } public double RatingValue { get; set; } [Index("IX_Single_UserRating", IsUnique = true, Order = 2)] public int SectionId { get; set; } [ForeignKey("UserId")] public virtual User User { set; get; } [Index("IX_Single_UserRating", IsUnique = true, Order = 3)] public int? UserId { set; get; } }
خروجی SQL چنین تنظیمی به صورت زیر است:
CREATE UNIQUE INDEX [IX_Single_UserRating] ON [UserRatings] ([SectionType] ASC,[SectionId] ASC,[UserId] ASC);