【问题标题】:Entity Framework Code first : Set unique key constraint is not working实体框架代码优先:设置唯一键约束不起作用
【发布时间】:2016-04-06 10:31:09
【问题描述】:

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

【问题讨论】:

  • 尝试设置Maxlength(200)
  • 如果 CONSTRAINT 创建唯一索引,您关心它什么?无论如何,索引“更好”并且强制执行唯一性 - 约束仅在您不设置索引时才有用。有索引吗?
  • 它没有用。而且我认为长度不是问题
  • @TomTom,我没听明白。
  • 如果你有一个唯一的索引,一个唯一的约束是没有用的。实际上,您也从不要求唯一的约束。它是否创建索引?这个问题有什么难理解的?

标签: c# entity-framework


【解决方案1】:

来自 EF Core Documentation

不能使用数据注释创建索引。

但是你可以使用fluent 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);
}

【讨论】:

  • 使用它,我在 EmailAddress 字段中获得了唯一值。但那个索引名称与我提到的不同。
  • @MaksymLabutin 更新了指向 ef 核心文档的链接。当我写下这个答案时,它被称为 ef7....
【解决方案2】:
[Index("IX_FirstAndSecond", 1, IsUnique = true)]
public int FirstColumn { get; set; }

[Index("IX_FirstAndSecond", 2, IsUnique = true)]
public int SecondColumn { get; set; }

【讨论】:

  • 虽然这段代码 sn-p 可以解决问题,但它没有解释为什么或如何回答这个问题。请include an explanation for your code,因为这确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
猜你喜欢
  • 2021-01-05
  • 1970-01-01
  • 2015-05-26
  • 1970-01-01
  • 2011-05-23
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2017-01-21
相关资源
最近更新 更多