如何使用数据注释在EF 7 Code First中指定唯一键

时间:2015-12-02 11:54:41

标签: entity-framework data-annotations code-first 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中的方法更改:

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

2 个答案:

答案 0 :(得分:8)

我担心在EF 7中仍然不支持使用数据注释创建Index。请检查link

我还尝试在上一版本中找到与该主题相关的一些信息,但我找不到任何内容。

EF 7 beta 8 release notes

EF 7 RC1 release notes

我现在找到一位来自EF开发者(divega)的post 说:

  

在EF7中,我们支持使用流畅的API定义索引,但不支持   属性,至少还没有。您可能是IndexAttribute   指的是我们在某些时候添加到EF 6.x包中的内容   但从未真正成为标准的DataAnnotation。

     

我们不想原样从EF6复制原始属性,因为   我们想要改变一些事情。也,   直接在DataAnnotations中使用它可能会更有意义   而不是将其添加到EF7包。   我应该提一下,我们不太可能添加   EF7 RTM时间范围内的IndexAttribute。

更新1

显然,这是一项不会添加到EF Core的功能,至少目前是这样。

来自EF Core documentation

  

无法使用数据注释配置索引。

但你可以使用Fluent Api来做到这一点:

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

答案 1 :(得分:1)

如果没有内置支持,您可以使用自己的自定义属性来注释模型属性并应用于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);
            }
        }
    }
}

使用简单的标记属性类:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class IndexAttribute : Attribute
{
}

然后在模型类中,只需添加属性即可创建二级索引:

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