はじめに
ASP.NET Coreでモデルを定義する場合はEntityクラスにテーブル定義を書き、DbContextクラスでデータベース定義を行います。 今回はそれらの定義に加えてEFCoreで特定のカラムにインデックスを付与する方法を記載します。
HasIndexメソッド
EFCoreを用いてインデックスを付与する場合はこちらのHasIndexメソッドを用います。
サンプルコード
HasIndexメソッドを使う際はDbContextクラスのOnModelCreatingメソッドをオーバーライドし、その中で定義をします。 下記にサンプルコードを記載します。
//Entity側 public class Person { public int PersonId { get; set; } public string Name { get; set; } public string Mail { get; set; } public int Age { get; set; } }
//DbContext側 public class SampleContext : DbContext { public SampleContext (DbContextOptions<SampleContext> options) : base(options) { } public DbSet<Person> Person { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { // ここでインデックスを付与したいカラム(プロパティ)に対してHasIndexメソッドを用いる modelBuilder.Entity<Person>() .HasIndex(o => o.Name); } }
その後、以下のコマンドを実行すると今回インデックスを付与する対象だったNameカラムにインデックスが付与されていることが分かります。
Add-Migration {任意の内容(マイグレーションファイルのクラス名)} Update-Database
インデックスの名前を変えたい場合はHasDatabaseNameを用いる!
インデックスの名前はデフォルトでは「IX\
任意の名前に変えたい場合は先ほどのHasIndexメソッドの後にHasDatabaseName("任意の名前")を付けます。
protected override void OnModelCreating(ModelBuilder modelBuilder) { // ここでインデックスを付与したいカラム(プロパティ)に対してHasIndexメソッドを用いる modelBuilder.Entity<Person>() .HasIndex(o => o.Name) .HasDatabaseName("Index-Name"); }
先ほどと同様にAdd-MigrationとUpdate-Databaseコマンドを実行してDBを更新すると・・・
インデックス名が変更されていることが分かります!
おわりに
インデックスをセットすることは結構あると思いますのでここら辺はしっかり覚えておくようにします!!