Sembra in Entity Framework 6.1 che hanno aggiunto la possibilità di creare indici tabella tramite il nuovo metodo HasColumnAnnotation
. Ho creato un paio di estensioni di supporto per accelerare il processo:È possibile utilizzare più indici utilizzando HasColumnAnnotation?
public static class MappingExtensions
{
public static StringPropertyConfiguration HasIndex(this StringPropertyConfiguration config, bool isUnique = false)
{
return config.HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute() { IsUnique = isUnique }));
}
public static StringPropertyConfiguration HasIndex(this StringPropertyConfiguration config, string name, int order = 1, bool isUnique = false)
{
return config.HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute(name, order) { IsUnique = isUnique }));
}
public static PrimitivePropertyConfiguration HasIndex(this PrimitivePropertyConfiguration config, bool isUnique = false)
{
return config.HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute() { IsUnique = isUnique }));
}
public static PrimitivePropertyConfiguration HasIndex(this PrimitivePropertyConfiguration config, string name, int order = 1, bool isUnique = false)
{
return config.HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute(name, order) { IsUnique = isUnique }));
}
}
Questo funziona fantastico ... fino a quando cerco di creare un secondo indice che contiene una colonna già utilizzato in un altro indice. Qualunque cosa aggiunga per ultima sovrascrive l'originale. Qualcuno sa se è attualmente possibile aggiungere più indici alla stessa colonna tramite il nuovo HasColumnAnnotation
disponibile su StringPropertyConfiguration
e PrimitivePropertyConfiguration
?
Posso aggirare il problema come sempre aggiungendo manualmente gli indici negli script di Migrazione, ma sarebbe eccellente poterlo configurare nei mapping EntityTypeConfiguration
in modo da poter avere tutto in un unico punto.
Dopo il feedback Gerts, questo è quello che ho finito per fare:
public static class MappingExtensions
{
public static StringPropertyConfiguration HasIndex(this StringPropertyConfiguration config, params IndexAttribute[] indexes)
{
return config.HasColumnAnnotation("Index", new IndexAnnotation(indexes));
}
public static PrimitivePropertyConfiguration HasIndex(this PrimitivePropertyConfiguration config, params IndexAttribute[] indexes)
{
return config.HasColumnAnnotation("Index", new IndexAnnotation(indexes));
}
}
Ed ecco il nuovo utilizzo:
Property(x => x.Name).IsRequired().HasMaxLength(65).HasIndex(new IndexAttribute("IX_Countries_Name") { IsUnique = true }, new IndexAttribute("IX_Countries_Published", 2))
Grazie Gert. Ho capito che potrebbe essere ciò che stava accadendo. L'ultimo esempio mi mostra cosa devo fare dopo.Probabilmente aggiusterò la mia classe helper in modo che accetti gli indici 'Params IndexAttribute [] 'così posso passare più indici per proprietà. Nuovo codice aggiunto alla domanda. – Sam
+1. Nel tuo ultimo pezzo di codice di esempio hai perso l'attributo 'IsUnique', avrebbe dovuto essere' new IndexAttribute ("ClientCompanyIndex", 1) {IsUnique = true} 'e' new IndexAttribute ("ClientAddressIndex", 1) {IsUnique = vero} '. –