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; }
"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 unterstützt keine eindeutigen Spalten außer Schlüsseln. Wenn Sie EF-Migrationen verwenden, können Sie EF zwingen, einen eindeutigen Index für die
UserName
Spalte zu erstellen (im Migrationscode, nicht durch Anmerkungen). Die Eindeutigkeit wird jedoch nur in der Datenbank erzwungen. Wenn Sie versuchen, einen doppelten Wert zu speichern, müssen Sie eine von der Datenbank ausgelöste Ausnahme (Einschränkungsverletzung) abfangen.quelle
Aus Ihrem Code geht hervor, dass Sie POCO verwenden. Ein weiterer Schlüssel ist nicht erforderlich : Sie können einen Index hinzufügen, wie von juFo vorgeschlagen .
Wenn Sie die Fluent-API verwenden, anstatt die UserName-Eigenschaft zuzuweisen, sollte Ihre Spaltenanmerkung folgendermaßen aussehen:
Dadurch wird das folgende SQL-Skript erstellt:
Wenn Sie versuchen, mehrere Benutzer mit demselben Benutzernamen einzufügen, wird eine DbUpdateException mit der folgenden Meldung angezeigt:
Auch hier sind Spaltenanmerkungen in Entity Framework vor Version 6.1 nicht verfügbar.
quelle
Beachten Sie, dass in Entity Framework 6.1 (derzeit in der Beta) das IndexAttribute unterstützt wird, um die Indexeigenschaften zu kommentieren, was automatisch zu einem (eindeutigen) Index in Ihren Code First Migrations führt.
quelle
In EF 6.2 mit FluentAPI können Sie verwenden
HasIndex()
quelle
Lösung für EF4.3
Eindeutiger Benutzername
Fügen Sie Datenanmerkungen über der Spalte hinzu als:
Eindeutige ID , ich habe Dekoration [Schlüssel] über meiner Spalte hinzugefügt und fertig. Gleiche Lösung wie hier beschrieben: https://msdn.microsoft.com/en-gb/data/jj591583.aspx
IE:
Alternative Antworten
Verwenden von Datenanmerkungen
mit Mapping
quelle
Key
Attributs zurUserName
Eigenschaft wird dieUserName
Eigenschaft zum Primärschlüssel in der Datenbank. Nur dieUserId
Eigenschaft sollte mit demKey
Attribut markiert werden. Diese Lösung gibt Ihnen das "richtige" Verhalten auf der Programmierseite, während Sie ein falsches Datenbankdesign erhalten.