Запретить индекс, созданный в соответствии с соглашением для таблицы "многие ко многим"

В приведенной ниже конфигурации EF создает индекс для SyntaxId условно. Поскольку у меня есть составной первичный ключ (служит индексом) и нет столбца идентификаторов, я не думаю, что этот созданный соглашением индекс для одного столбца необходим в таблице "многие ко многим".

Как я могу предотвратить этот индекс соглашения (b.HasIndex("SyntaxId");) из автоматически созданного?

public class SoftwareSyntaxTypeConfiguration : BaseJunctionTypeConfiguration<SoftwareSyntax>
{
    public override void Configure(EntityTypeBuilder<SoftwareSyntax> entityTypeBuilder)
    {
        base.Configure(entityTypeBuilder);
        entityTypeBuilder.ToTable("software_syntaxes");
        entityTypeBuilder.HasKey(x => new {x.SoftwareId, x.SyntaxId});
        entityTypeBuilder.HasOne(x => x.Software)
                         .WithMany(x => x.SoftwareSyntaxes)
                         .HasForeignKey(x => x.SoftwareId);
        entityTypeBuilder.HasOne(x => x.Syntax)
                         .WithMany(x => x.SoftwareSyntaxes)
                         .HasForeignKey(x => x.SyntaxId);
    }
}

partial class FilterListsDbContextModelSnapshot : ModelSnapshot
{
    protected override void BuildModel(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity("FilterLists.Data.Entities.Junctions.SoftwareSyntax", b =>
            {
                b.Property<int>("SoftwareId");

                b.Property<int>("SyntaxId");

                b.HasKey("SoftwareId", "SyntaxId");

                b.HasIndex("SyntaxId"); //TODO: prevent this from being auto-created

                b.ToTable("software_syntaxes");
            });
    }
}

Обновление: добавление классов сущностей для уточнения.

public class Software
{
    public int Id { get; set; }
    public ICollection<SoftwareSyntax> SoftwareSyntaxes { get; set; }
    ...
}

public class Syntax
{
    public int Id { get; set; }
    public ICollection<SoftwareSyntax> SoftwareSyntaxes { get; set; }
    ...
}

public class SoftwareSyntax
{
    public int SoftwareId { get; set; }
    public Software Software { get; set; }

    public int SyntaxId { get; set; }
    public Syntax Syntax { get; set; }
}

1 ответ

Решение

Оказывается, это пока официально не поддерживается.

Обходной путь, однако, должен использовать внутренний EF API. Его использование несет в себе предостережение о том, что оно может быть изменено без предварительного уведомления, поскольку оно не предназначено для внешнего использования.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    ((Model)modelBuilder.Model).ConventionDispatcher.StartBatch();
    foreach (var entityType in modelBuilder.Model.GetEntityTypes())
    foreach (var index in entityType.GetIndexes().ToList())
        // if index is one you want to remove
            entityType.RemoveIndex(index.Properties);
}

через Артура Виккерса

Так как у меня есть все мои многие ко многим объектам в одном и том же Junctions namespace, реализация, которая работает для меня в настоящее время:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    ((Model)modelBuilder.Model).ConventionDispatcher.StartBatch();
    foreach (var entityType in modelBuilder.Model.GetEntityTypes())
    foreach (var index in entityType.GetIndexes().ToList())
        if (index.DeclaringEntityType.Name.Contains("Junctions"))
            entityType.RemoveIndex(index.Properties);
}
Другие вопросы по тегам