پیشتر در رابطه با ایجاد ایندکس منحصر به فرد در EF Code first مطالبی در سایت منتشر شدهاند:
«ایجاد ایندکس منحصربفرد در EF Code first »
برای مدل فوق میخواهیم بر روی فیلدهای Title و CategoryId ایندکسی را ایجاد کنیم، برای این منظور کلاس زیر را برای ایجاد ایندکس ایجاد خواهیم کرد:
در نهایت با استفاده از HasColumnAnnotation ویژگی Index را به پراپرتی Title اضافه کردهایم. این متد دو پارامتر از ورودی دریافت میکند. پارامتر اول نام annotation میباشد که دقیقاً باید همنام با annotationهای موجود باشد. پارامتر دوم نیز میتواند یک رشته و یا یک آبجکت باشد. در حالت دوم آبجکتها باید قابلیت سریالایز شدن توسط اینترفیس IMetadataAnnotationSerializer را داشته باشند. در کد فوق ایندکس را بر روی دو فیلد ایجاد کردهایم. همچنین میتوان بر روی یک فیلد نیز چندین ایندکس داشته باشید:
«ایجاد ایندکس منحصربفرد در EF Code first »
«ایندکس منحصر به فرد با استفاده از Data Annotation در EF Code First»
«ایجاد ایندکس منحصربفرد بر روی چند فیلد با هم در EF Code first»
و یا استفاده از ویژگی Index در EF 6.1 به بعد
«ایجاد ایندکس منحصربفرد بر روی چند فیلد با هم در EF Code first»
و یا استفاده از ویژگی Index در EF 6.1 به بعد
در ادامه نحوهی ایجاد آن را به صورت Fluent API بررسی خواهیم کرد:
مدل زیر را در نظر بگیرید:
public class SubCategory : BaseEntity { public string Title { get; set; } [ForeignKey("CategoryId")] public virtual Category Category { get; set; } public Guid CategoryId { get; set; } }
public class SubCategoryConfiguration : EntityTypeConfiguration<SubCategory> { public SubCategoryConfiguration() { Property(p => p.CategoryId).HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("AK_SubCategory", 1){ IsUnique = true})); Property(p => p.Title).HasMaxLength(30).IsRequired().HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("AK_SubCategory", 2){ IsUnique = true})); Property(so => so.RowVersion).IsRowVersion(); } }
همانطور که مشاهده میکنید اینکار را با استفاده از ویژگی IndexAttribute انجام دادهایم. تمامی تنظیمات یک ایندکس را توسط این کلاس میتوانیم انجام دهیم؛ تنظیماتی از قبیل نام ایندکس، منحصر به فرد بودن ایندکس و... را میتوانیم مشخص کنیم:
public virtual bool IsClustered { get; set; } public virtual int Order { get; set; } public virtual bool IsUnique { get; set; }
Property(p => p.Title).HasMaxLength(30).IsRequired().HasColumnAnnotation("Index", new IndexAnnotation(new[] { new IndexAttribute("AK_Category_1") { IsUnique = true}, new IndexAttribute("AK_Category_2"), }));