用stream畅的API设置唯一的约束?

我试图用Code First构build一个EF实体,而使用stream利的API来构build一个EntityTypeConfiguration 。 创build主键很容易,但是使用唯一约束不是那么容易。 我看到的旧postbuild议为此执行本地SQL命令,但这似乎是失败的目的。 这是可能的与EF6?

EF6.1之后,您可以使用IndexAnnotation()在stream利的API中添加用于迁移的索引。

http://msdn.microsoft.com/en-us/data/jj591617.aspx#PropertyIndex

您必须添加引用:

 using System.Data.Entity.Infrastructure.Annotations; 

基本例子

这是一个简单的用法,在User.FirstName属性上添加一个索引

 modelBuilder .Entity<User>() .Property(t => t.FirstName) .HasColumnAnnotation(IndexAnnotation.AnnotationName, new IndexAnnotation(new IndexAttribute())); 

实例:

这是一个更现实的例子。 它在多个属性上添加一个唯一索引User.FirstNameUser.LastName ,索引名称为“IX_FIrstNameLastName”

 modelBuilder .Entity<User>() .Property(t => t.FirstName) .IsRequired() .HasMaxLength(60) .HasColumnAnnotation( IndexAnnotation.AnnotationName, new IndexAnnotation( new IndexAttribute("IX_FirstNameLastName", 1) { IsUnique = true })); modelBuilder .Entity<User>() .Property(t => t.LastName) .IsRequired() .HasMaxLength(60) .HasColumnAnnotation( IndexAnnotation.AnnotationName, new IndexAnnotation( new IndexAttribute("IX_FirstNameLastName", 2) { IsUnique = true })); 

作为Yorro答案的补充,也可以通过使用属性来完成。

在这种情况下需要引用的名称空间;

 using System.ComponentModel.DataAnnotations.Schema; 

样品

 public int Id { get; set; } [Index("IX_FirstNameLastName", 1, IsUnique = true)] public string FirstName { get; set; } [Index("IX_FirstNameLastName", 2, IsUnique = true)] public string LastName { get; set; } 

@ coni2k的答案是正确的,但是你必须添加[StringLength]属性才能工作,否则你会得到一个无效的键exception(下面的例子)。

 [StringLength(65)] [Index("IX_FirstNameLastName", 1, IsUnique = true)] public string FirstName { get; set; } [StringLength(65)] [Index("IX_FirstNameLastName", 2, IsUnique = true)] public string LastName { get; set; } 

下面是一个扩展方法来设置独特的索引更stream利:

 public static class MappingExtensions { public static PrimitivePropertyConfiguration IsUnique(this PrimitivePropertyConfiguration configuration) { return configuration.HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute { IsUnique = true })); } } 

用法:

 modelBuilder .Entity<Person>() .Property(t => t.Name) .IsUnique(); 

将生成如下迁移:

 public partial class Add_unique_index : DbMigration { public override void Up() { CreateIndex("dbo.Person", "Name", unique: true); } public override void Down() { DropIndex("dbo.Person", new[] { "Name" }); } } 

Src: 使用Entity Framework 6.1stream畅的API创build唯一索引

不幸的是,这在entity framework中不受支持。 这是在EF 6的路线图,但它被推回: Workitem 299:唯一约束(唯一索引)

同时有这个:

根据数据库中的其他行validation唯一字段的UniqueAttributeinheritanceDataAnnotations.ValidationAttribute 。

抱歉没有复制代码,有点长。