在我的应用程序中,我使用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的代码优先方法帮助我为字段设置唯一约束。
答案 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);
}