おーみんブログ

C#, ASP.NET Core, Unityが大好きです。

EFCoreのHasIndexメソッドを用いてDBのカラムにインデックスを作成する!

はじめに

ASP.NET Coreでモデルを定義する場合はEntityクラスにテーブル定義を書き、DbContextクラスでデータベース定義を行います。 今回はそれらの定義に加えてEFCoreで特定のカラムにインデックスを付与する方法を記載します。

HasIndexメソッド

EFCoreを用いてインデックスを付与する場合はこちらのHasIndexメソッドを用います。

docs.microsoft.com

サンプルコード

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

index.png

インデックスの名前を変えたい場合はHasDatabaseNameを用いる!

インデックスの名前はデフォルトでは「IX\\」(複合インデックスの場合は「\をアンダースコアで区切ったリスト」)となっています。

docs.microsoft.com

任意の名前に変えたい場合は先ほどのHasIndexメソッドの後にHasDatabaseName("任意の名前")を付けます。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // ここでインデックスを付与したいカラム(プロパティ)に対してHasIndexメソッドを用いる
    modelBuilder.Entity<Person>()
        .HasIndex(o => o.Name)
        .HasDatabaseName("Index-Name");
}

先ほどと同様にAdd-MigrationとUpdate-Databaseコマンドを実行してDBを更新すると・・・

index2.png

インデックス名が変更されていることが分かります!

おわりに

インデックスをセットすることは結構あると思いますのでここら辺はしっかり覚えておくようにします!!