如何使用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 Core中你是如何實現這一目標的?

一般承認的答案

從當前的EF Core文檔 - 索引部分:

數據註釋

無法使用數據註釋創建索引。

但是你肯定可以通過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合法嗎? 是的,了解原因