实体框架代码优先:设置唯一键约束不起作用

时间:2016-04-06 10:31:09

标签: c# entity-framework

在我的应用程序中,我使用EntityFramework和代码优先方法。我使用EF7与ASP.NET 4.6 MVC和VS2015。我的模型类如下:

public class Customer
{
    public int CustomerID { get; set; }

    [StringLength(100)]
    [Required]
    public string FirstName { get; set; }

    [StringLength(100)]
    [Required]
    public string LastName { get; set; }

    [Required]
    [EmailAddress(ErrorMessage = "Please enter valid Email Address.")]
    [StringLength(100)]
    [Index("IX_EA", IsUnique = true)]
    public string EmailAddress { get; set; }

}

我的上下文文件如下:

public class CustomerContext : DbContext
{
    public CustomerContext()
    {
        Database.EnsureCreated();
    }
    public DbSet<Customer> Customers { get; set; }
    protected override void OnConfiguring(DbContextOptionsBuilder options)
    {    
        var connection = System.Configuration.ConfigurationManager.ConnectionStrings["DbConnectionString"].ConnectionString;
        options.UseSqlServer(connection).UseRowNumberForPaging();
    }
}

因此,从模型类中您可以看到我想在数据库表中为EmailAddress列设置唯一约束意味着EmailAddress字段应该包含重复值(电子邮件地址不应该在表中重复)。但是当我运行项目数据库成功创建时。但那个独特的约束并不存在。我不明白为什么它没有在EmailAddress字段上设置该约束。

请使用EntityFramework的代码优先方法帮助我为字段设置唯一约束。

1 个答案:

答案 0 :(得分:2)

来自EF7 Documentation

  

无法使用数据注释创建索引。

但您可以使用流畅的API创建索引:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Customer>()
        .HasIndex(c => c.EmailAddress) // Create an index
        .IsUnique() // that is unique
        .ForSqlServerHasName("IX_EA"); // specify the name 
}

您也可以使用Alternate keys

  

除了主键之外,备用键还用作每个实体实例的备用唯一标识符。使用关系数据库时,这会映射到唯一索引/约束的概念。在EF中,备用键提供比唯一索引更多的功能,因为它们可以用作外键的目标。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Customer>()
        .HasAlternateKey(c => c.EmailAddress);
}