En Entity Framework 6.1+, puede usar este atributo en su modelo:
[Index(IsUnique=true)]
Puede encontrarlo en este espacio de nombres:
using System.ComponentModel.DataAnnotations.Schema;
Si el campo de su modelo es una cadena, asegúrese de que no esté configurado en nvarchar (MAX) en SQL Server o verá este error con Entity Framework Code First:
La columna 'x' de la tabla 'dbo.y' es de un tipo que no es válido para su uso como columna clave en un índice.
La razón es por esto:
SQL Server conserva el límite de 900 bytes para el tamaño total máximo de todas las columnas de clave de índice ".
(de: http://msdn.microsoft.com/en-us/library/ms191241.aspx )
Puede resolver esto estableciendo una longitud máxima de cadena en su modelo:
[StringLength(450)]
Su modelo se verá así ahora en EF CF 6.1+:
public class User
{
public int UserId{get;set;}
[StringLength(450)]
[Index(IsUnique=true)]
public string UserName{get;set;}
}
Actualizar:
si 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 } }));
}
}
y utilizar en su modelBuilder:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// ...
modelBuilder.Configurations.Add(new UserMap());
// ...
}
Actualización 2
para EntityFrameworkCore, consulte también este tema: https://github.com/aspnet/EntityFrameworkCore/issues/1698
Actualización 3
para EF6.2, consulte: https://github.com/aspnet/EntityFramework6/issues/274
Actualización 4
ASP.NET Core Mvc 2.2 con EF Core:
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Unique { get; set; }