In Entity Framework 6.1+ puoi usare questo attributo sul tuo modello:
[Index(IsUnique=true)]
Puoi trovarlo in questo spazio dei nomi:
using System.ComponentModel.DataAnnotations.Schema;
Se il campo del modello è una stringa, assicurati che non sia impostato su nvarchar (MAX) in SQL Server o vedrai questo errore con Entity Framework Code First:
La colonna "x" nella tabella "dbo.y" è di un tipo non valido per essere utilizzato come colonna chiave in un indice.
Il motivo è per questo:
SQL Server mantiene il limite di 900 byte per la dimensione totale massima di tutte le colonne chiave di indice. "
(da: http://msdn.microsoft.com/en-us/library/ms191241.aspx )
Puoi risolvere questo problema impostando una lunghezza massima della stringa sul tuo modello:
[StringLength(450)]
Il tuo modello apparirà così ora in EF CF 6.1+:
public class User
{
public int UserId{get;set;}
[StringLength(450)]
[Index(IsUnique=true)]
public string UserName{get;set;}
}
Aggiornare:
se usi 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 usa nel tuo modelBuilder:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// ...
modelBuilder.Configurations.Add(new UserMap());
// ...
}
Aggiorna 2
per EntityFrameworkCore vedere anche questo argomento: https://github.com/aspnet/EntityFrameworkCore/issues/1698
Aggiorna 3
per EF6.2 vedere: https://github.com/aspnet/EntityFramework6/issues/274
Aggiorna 4
ASP.NET Core Mvc 2.2 con EF Core:
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Unique { get; set; }