Dans Entity Framework 6.1+, vous pouvez utiliser cet attribut sur votre modèle:
[Index(IsUnique=true)]
Vous pouvez le trouver dans cet espace de noms:
using System.ComponentModel.DataAnnotations.Schema;
Si votre champ de modèle est une chaîne, assurez-vous qu'il n'est pas défini sur nvarchar (MAX) dans SQL Server ou vous verrez cette erreur avec Entity Framework Code First:
La colonne «x» de la table «dbo.y» est d'un type qui n'est pas valide pour être utilisée comme colonne clé dans un index.
La raison est à cause de ceci:
SQL Server conserve la limite de 900 octets pour la taille totale maximale de toutes les colonnes de clé d'index. "
(à partir de: http://msdn.microsoft.com/en-us/library/ms191241.aspx )
Vous pouvez résoudre ce problème en définissant une longueur de chaîne maximale sur votre modèle:
[StringLength(450)]
Votre modèle ressemblera maintenant à ceci dans EF CF 6.1+:
public class User
{
public int UserId{get;set;}
[StringLength(450)]
[Index(IsUnique=true)]
public string UserName{get;set;}
}
Mettre à jour:
si vous utilisez 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 } }));
}
}
et utilisez dans votre modelBuilder:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// ...
modelBuilder.Configurations.Add(new UserMap());
// ...
}
Mise à jour 2
pour EntityFrameworkCore, voir également cette rubrique: https://github.com/aspnet/EntityFrameworkCore/issues/1698
Mise à jour 3
pour EF6.2 voir: https://github.com/aspnet/EntityFramework6/issues/274
Mise à jour 4
ASP.NET Core Mvc 2.2 avec EF Core:
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Unique { get; set; }