W Entity Framework 6.1+ możesz użyć tego atrybutu w swoim modelu:
[Index(IsUnique=true)]
Możesz go znaleźć w tej przestrzeni nazw:
using System.ComponentModel.DataAnnotations.Schema;
Jeśli pole modelu jest ciągiem, upewnij się, że nie jest ustawione na nvarchar (MAX) w programie SQL Server lub zobaczysz ten błąd z Entity Framework Code First:
Kolumna „x” w tabeli „dbo.y” jest typu, którego nie można używać jako kolumny kluczowej w indeksie.
Powód jest taki:
SQL Server zachowuje limit 900 bajtów dla maksymalnego całkowitego rozmiaru wszystkich kolumn klucza indeksu. "
(z: http://msdn.microsoft.com/en-us/library/ms191241.aspx )
Możesz rozwiązać ten problem, ustawiając maksymalną długość łańcucha w swoim modelu:
[StringLength(450)]
Twój model będzie teraz wyglądał tak w EF CF 6.1+:
public class User
{
public int UserId{get;set;}
[StringLength(450)]
[Index(IsUnique=true)]
public string UserName{get;set;}
}
Aktualizacja:
jeśli używasz 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 } }));
}
}
i użyj w swoim modelBuilder:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// ...
modelBuilder.Configurations.Add(new UserMap());
// ...
}
Zaktualizuj 2
dla EntityFrameworkCore zobacz także ten temat: https://github.com/aspnet/EntityFrameworkCore/issues/1698
Zaktualizuj 3
dla EF6.2 patrz: https://github.com/aspnet/EntityFramework6/issues/274
Zaktualizuj 4
ASP.NET Core Mvc 2.2 z EF Core:
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Unique { get; set; }