如何使用數據註釋在EF 7 Code First中指定唯一鍵

code-first data-annotations entity-framework entity-framework-core

您可以使用Fluent Api指定唯一鍵:

public class MyContext : DbContext
{
    public DbSet<User> Users { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>()
            .HasIndex(u => u.Nickname)
            .IsUnique();
    }
}

public class User
{
    public int UserId { get; set; }
    public string Nickname { get; set; }
}

但是你可以用數據註釋來做嗎?

編輯

方法更改EF7 Beta 8:

public class MyContext : DbContext
{
    public DbSet<User> Users { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>()
            .HasIndex(u => u.Nickname)
            .IsUnique();
    }
}

public class User
{
    public int UserId { get; set; }
    public string Nickname { get; set; }
}

一般承認的答案

我擔心在EF 7中仍然不支持使用數據註釋創建Index 。請檢查此鏈接

我也嘗試在上一版本中找到與該主題相關的一些信息,但我找不到任何東西。

EF 7 beta 8發行說明

EF 7 RC1發行說明

我現在發現一個帖子從這樣說的EF開發商之一(divega):

在EF7中,我們支持使用流暢的API而不是屬性來定義索引,至少還沒有。您可能引用的IndexAttribute是我們在某些​​時候添加到EF 6.x包中但從未真正成為標準DataAnnotation的東西。

我們不想原樣從EF6複製原始屬性,因為我們想要改變一些內容。此外,直接在DataAnnotations中使用它可能比將其添加到EF7包更有意義。我應該提一下,我們不太可能在EF7 RTM時間幀中添加IndexAttribute。

更新1

顯然,這是一項不會添加到EF Core的功能,至少目前是這樣。

EF Core文檔

無法使用數據註釋配置索引。

但你可以使用Fluent Api來做到這一點:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .HasIndex(b => b.Url)
        .HasName("Index_Url");
}

熱門答案

如果沒有內置支持,您可以使用自己的自定義屬性來註釋模型屬性並應用於OnModelCreating()

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

使用簡單的標記屬性類:

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

然後在模型類中,只需添加屬性即可創建二級索引:

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



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因