Z twojego kodu wynika, że używasz POCO. Posiadanie innego klucza jest niepotrzebne: możesz dodać indeks zgodnie z sugestią podaną pod numerem juFo.
Jeśli używasz Fluent API zamiast przypisywania właściwości UserName swoją adnotację kolumna powinna wyglądać następująco:
this.Property(p => p.UserName)
.HasColumnAnnotation("Index", new IndexAnnotation(new[] {
new IndexAttribute("Index") { IsUnique = true }
}
));
To stworzy następujący skrypt SQL:
CREATE UNIQUE NONCLUSTERED INDEX [Index] ON [dbo].[Users]
(
[UserName] ASC
)
WITH (
PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF,
IGNORE_DUP_KEY = OFF,
DROP_EXISTING = OFF,
ONLINE = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON
) ON [PRIMARY]
przypadku próby wstawienia wielu użytkowników posiadających to samo UserName otrzymasz wyjątek DbUpdateException z następującym komunikatem:
Cannot insert duplicate key row in object 'dbo.Users' with unique index 'Index'.
The duplicate key value is (...).
The statement has been terminated.
Znów, kolumna annotati nie są dostępne w Entity Framework przed wersją 6.1.
Uważaj na to rozwiązanie. Dodanie atrybutu 'Key' do właściwości' UserName' spowoduje, że właściwość 'UserName' stanie się kluczem podstawowym w bazie danych. Tylko właściwość 'UserId' powinna być oznaczona za pomocą atrybutu' Key'. To rozwiązanie zapewni "prawidłowe" zachowanie po stronie programowania, jednocześnie dając niepoprawny projekt bazy danych. –
zabawna -10 zaakceptowana odpowiedź :) –