【发布时间】:2015-01-06 09:39:48
【问题描述】:
我想在表中强制执行唯一约束并且我正在使用实体框架代码优先。
是否可以使用 EF 6 添加唯一约束,因为我相信在早期版本中这是不可能的。
【问题讨论】:
标签: asp.net-mvc entity-framework entity-framework-5 entity-framework-6
我想在表中强制执行唯一约束并且我正在使用实体框架代码优先。
是否可以使用 EF 6 添加唯一约束,因为我相信在早期版本中这是不可能的。
【问题讨论】:
标签: asp.net-mvc entity-framework entity-framework-5 entity-framework-6
看来计划与版本 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
【讨论】:
假设您要在仅一个属性上添加唯一性约束,您可以从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。
【讨论】:
如果您避免使用注释,请使用它在配置类中定义它:
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
}
}
【讨论】: