用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.FirstName
和User.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 。
抱歉没有复制代码,有点长。