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; }
"There are no significant differences between creating a UNIQUE constraint and creating a unique index that is independent of a constraint. Data validation occurs in the same manner, and the query optimizer does not differentiate between a unique index created by a constraint or manually created. However, creating a UNIQUE constraint on the column makes the objective of the index clear."
msdn.microsoft.com/en-us/library/ms187019.aspxEF ne prend pas en charge les colonnes uniques à l'exception des clés. Si vous utilisez des migrations EF, vous pouvez forcer EF à créer un index unique sur la
UserName
colonne (dans le code de migration, pas par une annotation) mais l'unicité ne sera appliquée que dans la base de données. Si vous essayez d'enregistrer une valeur en double, vous devrez intercepter l'exception (violation de contrainte) déclenchée par la base de données.la source
À partir de votre code, il devient évident que vous utilisez POCO. Il n'est pas nécessaire d'avoir une autre clé: vous pouvez ajouter un index comme suggéré par juFo .
Si vous utilisez l'API Fluent au lieu d'attribuer la propriété UserName, votre annotation de colonne doit ressembler à ceci:
Cela créera le script SQL suivant:
Si vous essayez d'insérer plusieurs utilisateurs ayant le même nom d'utilisateur, vous obtiendrez une exception DbUpdateException avec le message suivant:
Là encore, les annotations de colonne ne sont pas disponibles dans Entity Framework avant la version 6.1.
la source
Notez que dans Entity Framework 6.1 (actuellement en version bêta) prendra en charge IndexAttribute pour annoter les propriétés d'index, ce qui entraînera automatiquement un index (unique) dans vos migrations Code First.
la source
Dans EF 6.2 utilisant FluentAPI , vous pouvez utiliser
HasIndex()
la source
Solution pour EF4.3
Nom d'utilisateur unique
Ajoutez une annotation de données sur la colonne comme:
ID unique , j'ai ajouté une décoration [Clé] sur ma colonne et c'est fait. Même solution que celle décrite ici: https://msdn.microsoft.com/en-gb/data/jj591583.aspx
C'EST À DIRE:
Réponses alternatives
utilisation de l'annotation de données
en utilisant la cartographie
la source
Key
attribut à laUserName
propriété fera que laUserName
propriété deviendra la clé primaire dans la base de données. Seule laUserId
propriété doit être marquée avec l'Key
attribut. Cette solution vous donnera le comportement «correct» du côté de la programmation tout en vous donnant une conception de base de données incorrecte.