J'ai trouvé trois façons de résoudre le problème.
Index uniques dans EntityFramework Core :
Première approche :
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Entity>()
.HasIndex(p => new {p.FirstColumn , p.SecondColumn}).IsUnique();
}
La deuxième approche pour créer des contraintes uniques avec EF Core en utilisant des clés alternatives.
Exemples
Une colonne :
modelBuilder.Entity<Blog>().HasAlternateKey(c => c.SecondColumn).HasName("IX_SingeColumn");
Colonnes multiples :
modelBuilder.Entity<Entity>().HasAlternateKey(c => new [] {c.FirstColumn, c.SecondColumn}).HasName("IX_MultipleColumns");
EF 6 et moins :
Première approche :
dbContext.Database.ExecuteSqlCommand(string.Format(
@"CREATE UNIQUE INDEX LX_{0} ON {0} ({1})",
"Entitys", "FirstColumn, SecondColumn"));
Cette approche est très rapide et utile mais le problème principal est qu'Entity Framework ne sait rien de ces changements !
Deuxième approche :
Je l'ai trouvé dans ce billet mais je n'ai pas essayé par moi-même.
CreateIndex("Entitys", new string[2] { "FirstColumn", "SecondColumn" },
true, "IX_Entitys");
Le problème de cette approche est le suivant : Elle nécessite DbMigration, alors que faire si vous ne l'avez pas ?
Troisième approche :
Je pense que c'est la meilleure, mais elle demande un peu de temps. Je me contenterai de vous montrer l'idée sous-jacente : Dans ce lien http://code.msdn.microsoft.com/CSASPNETUniqueConstraintInE-d357224a vous pouvez trouver le code pour l'annotation des données de la clé unique :
[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
Le problème de cette approche : comment les combiner ? J'ai l'idée d'étendre cette implémentation Microsoft par exemple :
[UniqueKey, 1] // Unique Key
public int FirstColumn { get; set;}
[UniqueKey ,1] // Unique Key
public int SecondColumn { get; set;}
Plus tard, dans l'IDatabaseInitializer, comme décrit dans l'exemple de Microsoft, vous pouvez combiner les clés en fonction de l'entier donné. Il convient toutefois de noter une chose : si la propriété unique est de type chaîne de caractères, vous devez définir la longueur maximale (MaxLength).