在 Entity Framework 6.1+ 中,您可以在模型上使用此属性:
[Index(IsUnique=true)]
你可以在这个命名空间中找到它:
using System.ComponentModel.DataAnnotations.Schema;
如果您的模型字段是字符串,请确保在 SQL Server 中未将其设置为 nvarchar(MAX),否则您将在 Entity Framework Code First 中看到以下错误:
表“dbo.y”中的列“x”的类型无法用作索引中的键列。
原因是因为这样:
SQL Server 保留所有索引键列的最大总大小 900 字节的限制。”
(from: http://msdn.microsoft.com/en-us/library/ms191241.aspx )
您可以通过在模型上设置最大字符串长度来解决此问题:
[StringLength(450)]
您的模型现在在 EF CF 6.1+ 中将如下所示:
public class User
{
public int UserId{get;set;}
[StringLength(450)]
[Index(IsUnique=true)]
public string UserName{get;set;}
}
Update:
如果你使用 Fluent:
public class UserMap : EntityTypeConfiguration<User>
{
public UserMap()
{
// ....
Property(x => x.Name).IsRequired().HasMaxLength(450).HasColumnAnnotation("Index", new IndexAnnotation(new[] { new IndexAttribute("Index") { IsUnique = true } }));
}
}
并在您的模型构建器中使用:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// ...
modelBuilder.Configurations.Add(new UserMap());
// ...
}
Update 2
对于 EntityFrameworkCore 另请参阅此主题:https://github.com/aspnet/EntityFrameworkCore/issues/1698
Update 3
对于 EF6.2,请参阅:https://github.com/aspnet/EntityFramework6/issues/274
Update 4
带有 EF Core 的 ASP.NET Core Mvc 2.2:
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Unique { get; set; }