Entity Framework Coreでクラスター化インデックスを作成する方法

clustered-index entity-framework entity-framework-core

質問

EF6.1から、プロパティにクラスタ化インデックスを指定する方法があります。

public class Person 
{
  [Index(IsClustered = true, IsUnique = true)]
  public long UserName { get; set; }
}

しかし、このIndex属性は現在EF Coreにはないようですか? EFコアではどのようにしてこれを達成しますか?

受け入れられた回答

現在のEF Core documentationから - Indexesセクション:

データ注釈

データ注釈を使用して索引を作成することはできません。

ただし、Fluent APIを使用して指定できることを確認してください( ForSqlServerプレフィックスを持つ拡張メソッドは、SqlServer固有の機能を示すようです)。

modelBuilder.Entity<Person>()
    .HasIndex(e => e.UserName)
    .IsUnique()
    .ForSqlServerIsClustered();

人気のある回答

ビルトインサポートがない場合は、独自のカスタム属性を使用してモデルプロパティに注釈を付け、 OnModelCreating()適用できます。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    foreach (var entity in modelBuilder.Model.GetEntityTypes())
    {
        foreach (var prop in entity.GetProperties())
        {
            var attr = prop.PropertyInfo.GetCustomAttribute<IndexAttribute>();
            if (attr != null)
            {
                var index = entity.AddIndex(prop);
                index.IsUnique = attr.IsUnique;
                index.SqlServer().IsClustered = attr.IsClustered;
            }
        }
    }
}

単純なマーカー属性クラスを使用すると:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class IndexAttribute : Attribute
{
    public bool IsUnique { get; set; } 
    public bool IsClustered { get; set; } 
}

次に、モデルクラスで、属性を追加してセカンダリインデックスを作成します。

public class User
{
    public int UserId { get; set; }
    [Index(IsUnique = true, IsClustered = true)]
    public string Nickname { get; set; }
}


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ