No Entity Framework 6.1+, você pode usar este atributo em seu modelo:
[Index(IsUnique=true)]
Você pode encontrá-lo neste namespace:
using System.ComponentModel.DataAnnotations.Schema;
Se o campo do seu modelo for uma string, certifique-se de que não esteja definido como nvarchar (MAX) no SQL Server ou você verá este erro com Entity Framework Code First:
A coluna 'x' na tabela 'dbo.y' é de um tipo inválido para uso como coluna-chave em um índice.
A razão é por isso:
O SQL Server retém o limite de 900 bytes para o tamanho total máximo de todas as colunas de chave de índice. "
(de: http://msdn.microsoft.com/en-us/library/ms191241.aspx )
Você pode resolver isso definindo um comprimento máximo da corda em seu modelo:
[StringLength(450)]
Seu modelo ficará assim agora no EF CF 6.1+:
public class User
{
public int UserId{get;set;}
[StringLength(450)]
[Index(IsUnique=true)]
public string UserName{get;set;}
}
Atualizar:
se você 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 } }));
}
}
e use em seu modelBuilder:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// ...
modelBuilder.Configurations.Add(new UserMap());
// ...
}
Atualização 2
para EntityFrameworkCore consulte também este tópico: https://github.com/aspnet/EntityFrameworkCore/issues/1698
Atualização 3
para EF6.2 consulte: https://github.com/aspnet/EntityFramework6/issues/274
Atualização 4
ASP.NET Core Mvc 2.2 com 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 não oferece suporte a colunas exclusivas, exceto chaves. Se você estiver usando EF Migrations, você pode forçar EF a criar um índice exclusivo na
UserName
coluna (no código de migração, não por qualquer anotação), mas a exclusividade será aplicada apenas no banco de dados. Se você tentar salvar um valor duplicado, terá que capturar a exceção (violação de restrição) acionada pelo banco de dados.fonte
A partir do seu código, torna-se aparente que você usa POCO. Ter outra chave é desnecessário: você pode adicionar um índice conforme sugerido por juFo .
Se você usar a API Fluent em vez de atribuir a propriedade UserName, a anotação da coluna deve ser semelhante a esta:
Isso criará o seguinte script SQL:
Se você tentar inserir vários usuários com o mesmo nome de usuário, receberá uma DbUpdateException com a seguinte mensagem:
Novamente, as anotações de coluna não estão disponíveis no Entity Framework antes da versão 6.1.
fonte
Observe que no Entity Framework 6.1 (atualmente em beta) oferecerá suporte ao IndexAttribute para anotar as propriedades do índice, o que resultará automaticamente em um índice (exclusivo) em suas Migrações do Code First.
fonte
No EF 6.2 usando FluentAPI , você pode usar
HasIndex()
fonte
Solução para EF4.3
Nome de usuário exclusivo
Adicione anotação de dados sobre a coluna como:
ID único , adicionei decoração [chave] em minha coluna e pronto. Mesma solução conforme descrito aqui: https://msdn.microsoft.com/en-gb/data/jj591583.aspx
IE:
Respostas alternativas
usando anotação de dados
usando mapeamento
fonte
Key
atributo àUserName
propriedade fará com que aUserName
propriedade se torne a chave primária no banco de dados. Apenas aUserId
propriedade deve ser marcada com oKey
atributo. Esta solução fornecerá o comportamento 'correto' no lado da programação, enquanto fornece um design de banco de dados incorreto.