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; }
"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."
EF no admite columnas únicas excepto claves. Si está utilizando EF Migraciones, puede obligar a EF a crear un índice único en la
UserName
columna (en el código de migración, no mediante ninguna anotación) pero la unicidad se aplicará solo en la base de datos. Si intenta guardar un valor duplicado, tendrá que detectar la excepción (violación de restricción) activada por la base de datos.fuente
A partir de su código, resulta evidente que usa POCO. No es necesario tener otra clave: puede agregar un índice como lo sugiere juFo .
Si usa Fluent API en lugar de atribuir la propiedad UserName, la anotación de su columna debería verse así:
Esto creará el siguiente script SQL:
Si intenta insertar varios usuarios con el mismo nombre de usuario, obtendrá una excepción DbUpdateException con el siguiente mensaje:
Nuevamente, las anotaciones de columna no están disponibles en Entity Framework antes de la versión 6.1.
fuente
Tenga en cuenta que en Entity Framework 6.1 (actualmente en versión beta) admitirá IndexAttribute para anotar las propiedades del índice, lo que dará como resultado automáticamente un índice (único) en sus migraciones de Code First.
fuente
En EF 6.2 usando FluentAPI , puede usar
HasIndex()
fuente
Solución para EF4.3
Nombre de usuario único
Agregue anotación de datos sobre la columna como:
Identificación única , agregué decoración [Clave] sobre mi columna y listo. Misma solución que se describe aquí: https://msdn.microsoft.com/en-gb/data/jj591583.aspx
ES DECIR:
Respuestas alternativas
usando la anotación de datos
usando mapeo
fuente
Key
atributo a laUserName
propiedad hará que laUserName
propiedad se convierta en la clave principal en la base de datos. Solo laUserId
propiedad debe estar marcada con elKey
atributo. Esta solución le dará el comportamiento 'correcto' en el lado de la programación y le dará un diseño de base de datos incorrecto.