Ответ 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)
}));
Теперь внезапно создание методов расширения гораздо менее привлекательно. Это вряд ли стоит усилий для создания одного для этой объединенной аннотации. Но для одноразовых столбцов ваши методы улучшаются.
Конечно, понятно, почему вы пытаетесь это сделать. Текущий свободный синтаксис, по меньшей мере, неуклюж. Команда EF прекрасно это знает, и они надеются, что кто-то из авторов этого вопроса вскоре получит эту проблему. Может быть, что-то для вас?