No Entity Framework 6.1+, você pode usar este atributo em seu modelo:
[Index(IsUnique=true)]
Você pode encontrá-lo neste namespace:
using System.ComponentModel.DataAnnotations.Schema;
Se o campo do seu modelo for uma string, certifique-se de que não esteja definido como nvarchar (MAX) no SQL Server ou você verá este erro com Entity Framework Code First:
A coluna 'x' na tabela 'dbo.y' é de um tipo inválido para uso como coluna-chave em um índice.
A razão é por isso:
O SQL Server retém o limite de 900 bytes para o tamanho total máximo de todas as colunas de chave de índice. "
(de: http://msdn.microsoft.com/en-us/library/ms191241.aspx )
Você pode resolver isso definindo um comprimento máximo da corda em seu modelo:
[StringLength(450)]
Seu modelo ficará assim agora no EF CF 6.1+:
public class User
{
public int UserId{get;set;}
[StringLength(450)]
[Index(IsUnique=true)]
public string UserName{get;set;}
}
Atualizar:
se você usa 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 } }));
}
}
e use em seu modelBuilder:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// ...
modelBuilder.Configurations.Add(new UserMap());
// ...
}
Atualização 2
para EntityFrameworkCore consulte também este tópico: https://github.com/aspnet/EntityFrameworkCore/issues/1698
Atualização 3
para EF6.2 consulte: https://github.com/aspnet/EntityFramework6/issues/274
Atualização 4
ASP.NET Core Mvc 2.2 com EF Core:
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Unique { get; set; }