【问题标题】:Is it possible to set a unique constraint using Entity Framework Code First?是否可以使用 Entity Framework Code First 设置唯一约束?
【发布时间】:2015-01-06 09:39:48
【问题描述】:

我想在表中强制执行唯一约束并且我正在使用实体框架代码优先。

是否可以使用 EF 6 添加唯一约束,因为我相信在早期版本中这是不可能的。

【问题讨论】:

标签: asp.net-mvc entity-framework entity-framework-5 entity-framework-6


【解决方案1】:

看来计划与版本 6 一起发布的 unique constraint feature 已被推送到 6.1。

使用 EF 6.1,您可以使用 Index 属性定义约束,如下所示:

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

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

您可以使用 MSDN 中所示的 Fluent API

【讨论】:

  • 感谢您的更新,因此创建此唯一索引与创建唯一约束具有相同的效果
  • 是的,它将为数据库中的列创建一个唯一索引。
  • 在 EF7 - DNX 中似乎找不到它。
  • 为什么要以“IX_”开头?
【解决方案2】:

假设您要在仅一个属性上添加唯一性约束,您可以从EF6.1开始执行以下操作

[Index(IsUnique = true)]
public string Username { get; set; }

如果您有多个字段与同一索引相关,那么您将使用:

多列索引

跨越多列的索引是 通过在多个索引注释中使用相同的名称指定 给定的表。创建多列索引时,需要指定 索引中列的顺序。例如下面的代码 在 Rating 和 BlogId 上创建一个名为的多列索引 IX_BlogAndRating。 BlogId 是索引和 Rating 中的第一列 是第二个。

public class Post 
{ 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public string Content { get; set; } 
    [Index("IX_BlogIdAndRating", 2)] 
    public int Rating { get; set; } 
    [Index("IX_BlogIdAndRating", 1)] 
    public int BlogId { get; set; } 
}

更多信息请参考this link

【讨论】:

    【解决方案3】:

    如果您避免使用注释,请使用它在配置类中定义它:

    public class YourTableConfig : EntityTypeConfiguration<YourTableEntity>
    {
      public YourTableConfig()
      {
        ToTable("YourTableDbName");
    
        HasKey(u => u.Id);
    
        Property(c => c.CompanyId).HasColumnType("nvarchar").HasMaxLength(9).IsRequired();
    
        HasIndex(x => x.CompanyId).IsUnique(); // This sets the unique index
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-07
      • 2013-12-06
      • 2011-11-13
      • 1970-01-01
      • 2012-08-02
      • 1970-01-01
      • 2016-07-12
      • 2019-04-19
      相关资源
      最近更新 更多