Несколько индексов возможно с помощью HasColumnAnnotation?
похоже, что в 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 }));
}
}
это работает фантастически...пока я не попытаюсь создать второй индекс, содержащий столбец, уже используемый в другом индексе. Все, что я добавлю последним, перепишет оригинал. Кто-нибудь знает, можно ли в настоящее время добавить несколько индексов в один столбец через new 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))
1 ответов
это потому, что каждый из ваших методов расширения назначает новую аннотацию свойству и перезаписывает предыдущую. Позвольте мне показать это на примере ваших методов.
скажем, у нас есть этот (бесполезный) класс
public class Client
{
public int ClientId { get; set; }
public int CompanyId { get; set; }
public int AddressId { get; set; }
}
и примените свои определения индекса (пропуская часть modelBuilder.Entity<Client>()
):
.Property(c => c.ClientId).HasIndex("ClientCompanyIndex");
.Property(c => c.CompanyId).HasIndex("ClientCompanyIndex", 2);
.Property(c => c.ClientId).HasIndex("ClientAddressIndex");
.Property(c => c.AddressId).HasIndex("ClientAddressIndex", 2);
встраивание методов расширения (слава Богу за Resharper) это приводит к
.Property(c => c.ClientId).HasColumnAnnotation("Index",
new IndexAnnotation(new IndexAttribute("ClientCompanyIndex", 1));
.Property(c => c.CompanyId).HasColumnAnnotation("Index",
new IndexAnnotation(new IndexAttribute("ClientCompanyIndex", 2));
.Property(c => c.ClientId).HasColumnAnnotation("Index",
new IndexAnnotation(new IndexAttribute("ClientAddressIndex", 1));
.Property(c => c.AddressId).HasColumnAnnotation("Index",
new IndexAnnotation(new IndexAttribute("ClientAddressIndex", 2));
это то же самое, что писать
[Index("ClientCompanyIndex", Order = 1)]
public int ClientId { get; set; }
а то замена это
[Index("ClientAddressIndex", Order = 1)]
public int ClientId { get; set; }
для воспроизведения правильной аннотации...
[Index("ClientAddressIndex", IsUnique = true, Order = 1)]
[Index("ClientCompanyIndex", IsUnique = true, Order = 1)]
public int ClientId { get; set; }
[Index("ClientCompanyIndex", IsUnique = true, Order = 2)]
public int CompanyId { get; set; }
[Index("ClientAddressIndex", IsUnique = true, Order = 2)]
public int AddressId { get; set; }
...конфигурация ClientId
свойство должно выглядеть как
.Property(c => c.ClientId).HasColumnAnnotation("Index",
new IndexAnnotation(new[]
{
new IndexAttribute("ClientCompanyIndex", 1),
new IndexAttribute("ClientAddressIndex", 1)
}));
теперь внезапно создание методов расширения гораздо менее привлекательно. Вряд ли стоит прилагать усилия, чтобы создать один для этой комбинированной аннотации. Но для одноразовых столбцов ваши методы являются улучшением.
конечно понятно почему ты пытаешься это сделать. Текущий синтаксис fluent является неуклюжим, чтобы не сказать больше. Команда EF знает это прекрасно и они надеются, что какой-то вкладчик скоро схватит эту проблему. Может, что-нибудь для тебя?