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 seconde 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");
Plusieurs colonnes:
modelBuilder.Entity<Entity>().HasAlternateKey(c => new [] {c.FirstColumn, c.SecondColumn}).HasName("IX_MultipleColumns");
EF 6 et inférieurs:
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 principal problème est qu'Entity Framework ne sait rien de ces changements!
Deuxième approche:
je l'ai trouvé dans ce post 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 a besoin de DbMigration, alors que faites-vous si vous ne l'avez pas?
Troisième approche:
je pense que c'est la meilleure mais cela demande du temps. Je vais juste vous montrer l'idée derrière cela: Dans ce lien http://code.msdn.microsoft.com/CSASPNETUniqueConstraintInE-d357224a,
vous pouvez trouver le code d'annotation de données de 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 puis-je les combiner? J'ai une 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 loin dans IDatabaseInitializer comme décrit dans l'exemple Microsoft, vous pouvez combiner les clés en fonction de l'entier donné. Une chose doit être notée cependant: si la propriété unique est de type chaîne, vous devez définir la longueur maximale.