In Entity Framework 6.1+ können Sie dieses Attribut für Ihr Modell verwenden:
[Index(IsUnique=true)]
Sie finden es in diesem Namespace:
using System.ComponentModel.DataAnnotations.Schema;
Wenn Ihr Modellfeld eine Zeichenfolge ist, stellen Sie sicher, dass es in SQL Server nicht auf nvarchar (MAX) festgelegt ist. Andernfalls wird dieser Fehler zuerst mit Entity Framework-Code angezeigt:
Die Spalte 'x' in der Tabelle 'dbo.y' ist vom Typ, der für die Verwendung als Schlüsselspalte in einem Index ungültig ist.
Der Grund ist aus diesem Grund:
SQL Server behält das 900-Byte-Limit für die maximale Gesamtgröße aller Indexschlüsselspalten bei. "
(von: http://msdn.microsoft.com/en-us/library/ms191241.aspx )
Sie können dies lösen, indem Sie eine maximale Zeichenfolgenlänge für Ihr Modell festlegen:
[StringLength(450)]
Ihr Modell wird jetzt in EF CF 6.1+ so aussehen:
public class User
{
public int UserId{get;set;}
[StringLength(450)]
[Index(IsUnique=true)]
public string UserName{get;set;}
}
Aktualisieren:
Wenn Sie Fluent verwenden:
public class UserMap : EntityTypeConfiguration<User>
{
public UserMap()
{
// ....
Property(x => x.Name).IsRequired().HasMaxLength(450).HasColumnAnnotation("Index", new IndexAnnotation(new[] { new IndexAttribute("Index") { IsUnique = true } }));
}
}
und verwenden Sie in Ihrem modelBuilder:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// ...
modelBuilder.Configurations.Add(new UserMap());
// ...
}
Update 2
Informationen zu EntityFrameworkCore finden Sie auch in diesem Thema: https://github.com/aspnet/EntityFrameworkCore/issues/1698
Update 3
EF6.2 finden Sie unter: https://github.com/aspnet/EntityFramework6/issues/274
Update 4
ASP.NET Core Mvc 2.2 mit EF Core:
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Unique { get; set; }