Apakah ada cara untuk membuat indeks pada properti / kolom menggunakan code-first, daripada menggunakan yang baru IndexAttribute
?
Apakah ada cara untuk membuat indeks pada properti / kolom menggunakan code-first, daripada menggunakan yang baru IndexAttribute
?
Jawaban:
Nah 26.10.2017 Entity Framework 6.2 secara resmi dirilis . Ini mencakup kemungkinan untuk menentukan indeks dengan mudah melalui Fluent API. Ho itu digunakan sudah diumumkan dalam versi beta 6.2.
Sekarang Anda dapat menggunakan HasIndex()
metode ini, diikuti oleh IsUnique()
jika itu adalah indeks unik.
Contoh perbandingan kecil (sebelum / sesudah):
// before
modelBuilder.Entity<Person>()
.Property(e => e.Name)
.HasColumnAnnotation(
IndexAnnotation.AnnotationName,
new IndexAnnotation(new IndexAttribute { IsUnique = true }));
// after
modelBuilder.Entity<Person>()
.HasIndex(p => p.Name)
.IsUnique();
// multi column index
modelBuilder.Entity<Person>()
.HasIndex(p => new { p.Name, p.Firstname })
.IsUnique();
Juga dimungkinkan untuk menandai indeks sebagai clustered with .IsClustered()
.
EDIT # 1
Menambahkan contoh untuk indeks multi kolom dan informasi tambahan tentang cara menandai indeks sebagai berkerumun.
EDIT # 2
Sebagai informasi tambahan, di EF Core 2.1 persis sama seperti di EF 6.2 sekarang.
Berikut adalah artcile MS Doc sebagai referensi.
new
. Saya akan memperbaikinya.
Saat ini tidak ada "dukungan kelas satu" untuk membuat indeks melalui API yang lancar, tetapi yang dapat Anda lakukan adalah melalui API yang lancar Anda dapat menandai properti sebagai memiliki atribut dari API Anotasi. Ini akan memungkinkan Anda untuk menambahkan Index
atribut melalui antarmuka yang lancar.
Berikut adalah beberapa contoh dari item pekerjaan dari situs Issues untuk EF.
Buat indeks pada satu kolom:
modelBuilder.Entity<MyEntity>()
.Property(e => e.MyProperty)
.HasColumnAnnotation(
IndexAnnotation.AnnotationName,
new IndexAnnotation(new IndexAttribute()));
Beberapa indeks dalam satu kolom:
modelBuilder.Entity<MyEntity>()
.Property(e => e.MyProperty)
.HasColumnAnnotation(
IndexAnnotation.AnnotationName,
new IndexAnnotation(new[]
{
new IndexAttribute("Index1"),
new IndexAttribute("Index2") { IsUnique = true }
}));
Indeks Multi-Kolom:
modelBuilder.Entity<MyEntity>()
.Property(e => e.MyProperty1)
.HasColumnAnnotation(
IndexAnnotation.AnnotationName,
new IndexAnnotation(new IndexAttribute("MyIndex", 1)));
modelBuilder.Entity<MyEntity>()
.Property(e => e.MyProperty2)
.HasColumnAnnotation(
IndexAnnotation.AnnotationName,
new IndexAnnotation(new IndexAttribute("MyIndex", 2)));
Menggunakan teknik di atas akan menyebabkan .CreateIndex()
panggilan dibuat secara otomatis untuk Anda dalam Up()
fungsi saat Anda menyusun migrasi berikutnya (atau secara otomatis dibuat dalam database jika Anda tidak menggunakan migrasi).
.Primarykey(x=>x.id,clustered:false)
method
HasAnnotation
metode tersebut dan tidak ada metode seperti ini. tetapi saya menemukan metode yang namanya HasColumnAnnotation
menerima parameter yang Anda berikan. Apakah Anda perlu memperbarui jawaban Anda atau saya salah?
Saya telah membuat beberapa metode ekstensi dan membungkusnya dalam paket nuget untuk membuatnya lebih mudah.
Instal EntityFramework.IndexingExtensions
paket nuget.
Kemudian Anda dapat melakukan hal berikut:
public class MyDataContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Customer>()
.HasIndex("IX_Customers_Name", // Provide the index name.
e => e.Property(x => x.LastName), // Specify at least one column.
e => e.Property(x => x.FirstName)) // Multiple columns as desired.
.HasIndex("IX_Customers_EmailAddress", // Supports fluent chaining for more indexes.
IndexOptions.Unique, // Supports flags for unique and clustered.
e => e.Property(x => x.EmailAddress));
}
}
Proyek dan kode sumber ada di sini . Nikmati!
IndexAttribute
kelas EF , jadi saya tidak dapat memasukkannya ke dalam perpustakaan saya.
Tanpa nama eksplisit:
[Index]
public int Rating { get; set; }
Dengan nama tertentu:
[Index("PostRatingIndex")]
public int Rating { get; set; }
EntityFramework
. itu termasuk dalam majelis itu. hanya bingung dengan NS.
instead of using the new IndexAttribute
apakah Anda memperhatikannya?
Dari EF 6.1 dan seterusnya, atribut [Index]
ini didukung.
Gunakan [Index(IsUnique = true)]
untuk indeks unik.
Ini tautan dari Microsoft
public class User
{
public int UserId { get; set; }
[Index(IsUnique = true)]
[StringLength(200)]
public string Username { get; set; }
public string DisplayName { get; set; }
}
[Index("IX_BlogIdAndRating", 2)]
public int Rating { get; set; }
[Index("IX_BlogIdAndRating", 1)]
public int BlogId { get; set; }
Berikut referensi dari Microsoft
Kerangka Entitas 6
Property(c => c.MyColumn)
.HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("IX_MyIndex")));
Dan tambahkan menggunakan:
using System.Data.Entity.Infrastructure.Annotations;
using System.ComponentModel.DataAnnotations.Schema;
Anda dapat menggunakan anotasi data INDEX Kode Anotasi Data Pertama
Jika Anda tidak ingin menggunakan atribut pada POCO Anda, Anda selalu dapat melakukannya seperti berikut:
context.Database.ExecuteSqlCommand("CREATE INDEX IX_NAME ON ...");
Anda dapat menjalankan pernyataan ini di DbInitializer
kelas turunan khusus Anda . Saya tidak tahu cara API Lancar untuk melakukan ini.
Saya menulis metode ekstensi untuk digunakan dalam EF yang lancar untuk menghindari kode tambahan:
public static PrimitivePropertyConfiguration HasIndexAnnotation(
this PrimitivePropertyConfiguration primitivePropertyConfiguration,
IndexAttribute indexAttribute = null
)
{
indexAttribute = indexAttribute ?? new IndexAttribute();
return primitivePropertyConfiguration
.HasColumnAnnotation(
IndexAnnotation.AnnotationName,
new IndexAnnotation(indexAttribute)
);
}
lalu gunakan seperti ini:
Property(t => t.CardNo)
.HasIndexAnnotation();
atau seperti ini jika indeks membutuhkan beberapa konfigurasi:
Property(t => t.CardNo)
.HasIndexAnnotation(new IndexAttribute("IX_Account") { IsUnique = true });
Anda bisa menggunakan salah satunya
// Indeks
this.HasIndex(e => e.IsActive)
.HasName("IX_IsActive");
atau
this.Property(e => e.IsActive).HasColumnAnnotation(
"Index",
new IndexAnnotation(new IndexAttribute("IX_IsActive")));