Entity Framework Coreでクラスター化・非クラスター化インデックスを設定する方法
2022-11-08
azblob://2022/11/11/eyecatch/2022-11-08-entity-framework-core-clustered-nonclustered-index-000.jpg

こんにちは、あおいです。NASDAQちゃん、最近メンヘラ気味ですね。今は病み期ピークって感じですね。

さて、現在はドメイン駆動開発の手法でEntity Framework Coreを使ってインフラ層の実装をしています。テーブル定義でインデックスを設定する際に、FluentAPIを使ってクラスター化・非クラスタ-化インデックスを設定しようとしたんですが、若干詰まってしまったことがありました。

そこで、今回はEntity Framework Coreでクラスター化・非クラスター化インデックスを設定する方法を備忘録として記事に残します。

以下のUserクラスを例として、クラスター化・非クラスター化インデックスを設定していきます。

public class User
{
    public int UserId { get; set; }
    public string LastName { get; set; }
    public string FirstName { get; set; }
 public int Age { get; set; }
}

クラスター化インデックスの場合、FluentAPIで以下のように設定します。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{ 
 base.OnModelCreating(modelBuilder);
 modelBuilder.Entity<User>(entity => 
   {
  // クラスター化インデックスの設定
  entity.HasKey(user => user.UserId)
  .IsClustered(true)
  .HasName("PK_Users");
   });
}

非クラスター化インデックスの場合、FluentAPIで以下のように設定します。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
 base.OnModelCreating(modelBuilder);
 modelBuilder.Entity<User>(entity => 
   {
  // 非クラスター化インデックスの設定 
  entity.HasIndex(user => new { user.LastName, user.FirstName }) ※複合インデックスキーの場合
  .IsClustered(false)
  .HasDatabaseName("IDX_Users_LastName_FirstName");
   });
}

書き方が微妙に違うの厄介ですね、、、