Похоже, что в Entity Framework 6.1 они добавили возможность создания табличных индексов с помощью нового метода 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 }));
}
}
Это работает фантастически... пока я не попытаюсь создать второй индекс, содержащий столбец, уже использованный в другом индексе. Независимо от того, что я добавляю, последняя перезаписывает оригинал. Кто-нибудь знает, возможно ли в настоящее время добавить несколько индексов в один и тот же столбец через новый HasColumnAnnotation
, доступный в StringPropertyConfiguration
и PrimitivePropertyConfiguration
?
Я могу обойти это, как всегда, вручную добавляя индексы в сценарии миграции, но было бы очень удобно настраивать это в сопоставлениях EntityTypeConfiguration
, чтобы я мог иметь все это в одном месте.
После обратной связи Gerts это то, что я закончил:
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));
}
}
И вот новое использование:
Property(x => x.Name).IsRequired().HasMaxLength(65).HasIndex(new IndexAttribute("IX_Countries_Name") { IsUnique = true }, new IndexAttribute("IX_Countries_Published", 2))