В Entity Framework 6.1+ вы можете использовать этот атрибут в своей модели:
[Index(IsUnique=true)]
Вы можете найти его в этом пространстве имен:
using System.ComponentModel.DataAnnotations.Schema;
Если поле вашей модели является строкой, убедитесь, что для него не установлено значение nvarchar (MAX) в SQL Server, иначе вы увидите эту ошибку с Entity Framework Code First:
Столбец «x» в таблице «dbo.y» имеет тип, недопустимый для использования в качестве ключевого столбца в индексе.
Причина в следующем:
SQL Server сохраняет ограничение в 900 байт для максимального общего размера всех столбцов ключа индекса ».
(с: http://msdn.microsoft.com/en-us/library/ms191241.aspx )
Вы можете решить эту проблему, установив максимальную длину строки в своей модели:
[StringLength(450)]
Теперь ваша модель в EF CF 6.1+ будет выглядеть так:
public class User
{
public int UserId{get;set;}
[StringLength(450)]
[Index(IsUnique=true)]
public string UserName{get;set;}
}
Обновить:
если вы используете 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 } }));
}
}
и используйте в своем modelBuilder:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// ...
modelBuilder.Configurations.Add(new UserMap());
// ...
}
Обновление 2
для EntityFrameworkCore см. также эту тему: https://github.com/aspnet/EntityFrameworkCore/issues/1698
Обновление 3
для EF6.2 см. https://github.com/aspnet/EntityFramework6/issues/274
Обновление 4
ASP.NET Core Mvc 2.2 с EF Core:
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Unique { get; set; }