C'è un modo per creare un indice su una proprietà / colonna usando codice-prima, invece di usare il nuovo IndexAttribute
?
Bene 26.10.2017 Entity Framework 6.2 è stato ufficialmente rilasciato . Include la possibilità di definire facilmente gli indici tramite l'API Fluent. Ho è stato già annunciato nella versione beta di 6.2.
Ora puoi usare il metodo HasIndex()
, seguito da IsUnique()
se dovrebbe essere un indice univoco.
Solo un piccolo esempio di confronto (prima / dopo):
// before
modelBuilder.Entity<Person>()
.Property(e => e.Name)
.HasColumnAnnotation(
IndexAnnotation.AnnotationName,
new IndexAnnotation(new IndexAttribute { IsUnique = true }));
// after
modelBuilder.Entity<Person>()
.HasIndex(p => p.Name)
.IsUnique();
// multi column index
modelBuilder.Entity<Person>()
.HasIndex(p => new { p.Name, p.Firstname })
.IsUnique();
È anche possibile contrassegnare l'indice come cluster con. .IsClustered()
.
MODIFICA # 1
Aggiunto un esempio per l'indice multi colonna e informazioni aggiuntive su come contrassegnare un indice come cluster.
MODIFICA # 2
Come informazioni aggiuntive, in EF Core 2.1 è esattamente la stessa di EF 6.2 ora.
Ecco la artcile di MS Doc come riferimento.
Attualmente non esiste un "supporto di prima classe" per la creazione di un indice tramite l'API fluente, ma ciò che si può fare tramite l'API fluente è possibile contrassegnare le proprietà come aventi attributi dall'API di annotazione. Questo ti permetterà di aggiungere l'attributo Index
tramite un'interfaccia fluente.
Ecco alcuni esempi dell'elemento di lavoro dal sito Issues per EF.
Crea un indice su una singola colonna:
modelBuilder.Entity<MyEntity>()
.Property(e => e.MyProperty)
.HasColumnAnnotation(
IndexAnnotation.AnnotationName,
new IndexAnnotation(new IndexAttribute()));
Più indici su una singola colonna:
modelBuilder.Entity<MyEntity>()
.Property(e => e.MyProperty)
.HasColumnAnnotation(
IndexAnnotation.AnnotationName,
new IndexAnnotation(new[]
{
new IndexAttribute("Index1"),
new IndexAttribute("Index2") { IsUnique = true }
}));
Indici multi-colonna:
modelBuilder.Entity<MyEntity>()
.Property(e => e.MyProperty1)
.HasColumnAnnotation(
IndexAnnotation.AnnotationName,
new IndexAnnotation(new IndexAttribute("MyIndex", 1)));
modelBuilder.Entity<MyEntity>()
.Property(e => e.MyProperty2)
.HasColumnAnnotation(
IndexAnnotation.AnnotationName,
new IndexAnnotation(new IndexAttribute("MyIndex", 2)));
Utilizzando le tecniche sopra .CreateIndex()
chiamate .CreateIndex()
verranno create automaticamente per te nella funzione Up()
quando impalcerai la tua prossima migrazione (o verrai automaticamente creato nel database se non stai utilizzando le migrazioni).