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; }
"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."
EF nie obsługuje unikatowych kolumn z wyjątkiem kluczy. Jeśli używasz migracji EF, możesz zmusić EF do utworzenia unikatowego indeksu w
UserName
kolumnie (w kodzie migracji, a nie przez żadną adnotację), ale unikatowość zostanie wymuszona tylko w bazie danych. Jeśli spróbujesz zapisać zduplikowaną wartość, będziesz musiał wychwycić wyjątek (naruszenie ograniczeń) wywołany przez bazę danych.źródło
Z twojego kodu wynika, że używasz POCO. Posiadanie innego klucza jest niepotrzebne: możesz dodać indeks zgodnie z sugestią juFo .
Jeśli używasz Fluent API zamiast przypisywać właściwość UserName, adnotacja kolumny powinna wyglądać następująco:
Spowoduje to utworzenie następującego skryptu SQL:
Jeśli spróbujesz wstawić wielu użytkowników o tej samej nazwie użytkownika, otrzymasz wyjątek DbUpdateException z następującym komunikatem:
Ponownie adnotacje kolumn nie są dostępne w Entity Framework wcześniejszych niż wersja 6.1.
źródło
Należy pamiętać, że w Entity Framework 6.1 (obecnie w wersji beta) będzie obsługiwać IndexAttribute w celu dodawania adnotacji do właściwości indeksu, które automatycznie spowodują utworzenie (unikatowego) indeksu w migracji Code First.
źródło
W EF 6.2 używającym FluentAPI możesz używać
HasIndex()
źródło
Rozwiązanie dla EF4.3
Unikalna nazwa użytkownika
Dodaj adnotację danych do kolumny jako:
Unikalny identyfikator , dodałem dekorację [klucz] nad moją kolumną i gotowe. To samo rozwiązanie, co opisane tutaj: https://msdn.microsoft.com/en-gb/data/jj591583.aspx
TO ZNACZY:
Alternatywne odpowiedzi
za pomocą adnotacji danych
za pomocą mapowania
źródło
Key
atrybutu doUserName
właściwości spowoduje, żeUserName
właściwość stanie się kluczem podstawowym w bazie danych. TylkoUserId
właściwość powinna być oznaczonaKey
atrybutem. To rozwiązanie zapewni „prawidłowe” zachowanie po stronie programowania, dając jednocześnie niepoprawny projekt bazy danych.