Dal tuo codice diventa evidente che usi POCO. Non è necessario avere un'altra chiave: è possibile aggiungere un indice come suggerito da juFo.
Se si utilizza API perfetto invece di attribuire proprietà UserName vostra annotazione colonna dovrebbe essere simile a questo:
this.Property(p => p.UserName)
.HasColumnAnnotation("Index", new IndexAnnotation(new[] {
new IndexAttribute("Index") { IsUnique = true }
}
));
questo modo si crea il seguente script 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]
Se si tenta di inserire più utenti con lo stesso nome utente si otterrà un DbUpdateException con il seguente messaggio:
Cannot insert duplicate key row in object 'dbo.Users' with unique index 'Index'.
The duplicate key value is (...).
The statement has been terminated.
Anche in questo caso, la colonna annotati non sono disponibili in Entity Framework prima della versione 6.1.
fonte
2014-04-17 15:32:44
Attenzione a questa soluzione. Aggiungendo l'attributo 'Key' alla proprietà' UserName', la proprietà 'UserName' diventerà la chiave primaria nel database. Solo la proprietà 'UserId' dovrebbe essere contrassegnata con l'attributo' Key'. Questa soluzione ti darà il comportamento 'corretto' sul lato della programmazione mentre ti fornirai una progettazione di database errata. –
buffo -10 risposta accettata :) –