Ho trovato tre modi per risolvere il problema.
Indici univoci in EntityFramework Core:
Primo approccio:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Entity>()
.HasIndex(p => new {p.FirstColumn , p.SecondColumn}).IsUnique();
}
Il secondo approccio per creare vincoli univoci con EF Core utilizzando i tasti alternativi.
Esempi
Una colonna:
modelBuilder.Entity<Blog>().HasAlternateKey(c => c.SecondColumn).HasName("IX_SingeColumn");
Colonne multiple:
modelBuilder.Entity<Entity>().HasAlternateKey(c => new [] {c.FirstColumn, c.SecondColumn}).HasName("IX_MultipleColumns");
EF 6 e inferiore:
Primo approccio:
dbContext.Database.ExecuteSqlCommand(string.Format(
@"CREATE UNIQUE INDEX LX_{0} ON {0} ({1})",
"Entitys", "FirstColumn, SecondColumn"));
Questo approccio è molto rapido e utile, ma il problema principale è che Entity Framework non sa nulla di questi cambiamenti!
Secondo approccio: l'
ho trovato in questo post ma non ho provato da solo.
CreateIndex("Entitys", new string[2] { "FirstColumn", "SecondColumn" },
true, "IX_Entitys");
Il problema di questo approccio è il seguente: ha bisogno di DbMigration, quindi cosa fai se non ce l'hai?
Terzo approccio:
penso che questo sia il migliore, ma richiede del tempo per farlo. Ti mostrerò solo l'idea alla base: in questo link http://code.msdn.microsoft.com/CSASPNETUniqueConstraintInE-d357224a
puoi trovare il codice per l'annotazione dei dati chiave univoci:
[UniqueKey] // Unique Key
public int FirstColumn { get; set;}
[UniqueKey] // Unique Key
public int SecondColumn { get; set;}
// The problem hier
1, 1 = OK
1 ,2 = NO OK 1 IS UNIQUE
Il problema per questo approccio; Come posso combinarli? Ho un'idea per estendere questa implementazione Microsoft ad esempio:
[UniqueKey, 1] // Unique Key
public int FirstColumn { get; set;}
[UniqueKey ,1] // Unique Key
public int SecondColumn { get; set;}
Più avanti in IDatabaseInitializer come descritto nell'esempio Microsoft è possibile combinare le chiavi in base al numero intero indicato. È necessario notare una cosa: se la proprietà unica è di tipo stringa, è necessario impostare MaxLength.