EF Core - составной первичный ключ удаляет один индекс - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть эта сущность:

[Table("order")]
public class Order
{
    [Key]
    [Column("id")]
    public Guid Id { get; set; }

    [MaxLength(128)]
    [Column("description")]
    public string Description { get; set; }

    [ForeignKey("Student")]
    [Column("student_id")]
    public Guid StudentId { get; set; }

    [ForeignKey("Employer")]
    [Column("employer_id")]
    public Guid EmployerId { get; set; }

    [ForeignKey("Customer")]
    [Column("customer_id")]
    public Guid CustomerId { get; set; }

    public virtual Guid Student { get; set; }
    public virtual Guid Employer { get; set; }
    public virtual Guid Customer { get; set; }
}

И я вижу следующий снимок DbContext:

modelBuilder.Entity("DataInterface.Models.Order", b =>
{
    b.Property<Guid>("Id")
        .ValueGeneratedOnAdd()
        .HasColumnName("id");

    b.Property<string>("Description")
        .HasColumnName("description")
        .HasMaxLength(128);

    b.Property<Guid>("StudentId")
        .HasColumnName("student_id");

    b.Property<Guid>("EmployerId")
        .HasColumnName("employer_id");

    b.Property<Guid>("CustomerId")
        .HasColumnName("customer_id");

    b.HasKey("Id");

    b.HasIndex("StudentId");

    b.HasIndex("EmployerId");

    b.HasIndex("CustomerId");

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

Как вы видите - все хорошо.Но мне нужно создать составной ключ и удалить первичный ключ.Итак, давайте сделаем это.Мой новый код сущности (без Id первичного ключа):

[Table("order")]
public class Order
{
    [MaxLength(128)]
    [Column("description")]
    public string Description { get; set; }

    [ForeignKey("Student")]
    [Column("student_id")]
    public Guid StudentId { get; set; }

    [ForeignKey("Employer")]
    [Column("employer_id")]
    public Guid EmployerId { get; set; }

    [ForeignKey("Customer")]
    [Column("customer_id")]
    public Guid CustomerId { get; set; }

    public virtual Guid Student { get; set; }
    public virtual Guid Employer { get; set; }
    public virtual Guid Customer { get; set; }
}

Я добавляю новое поведение к методу OnModelCreating моего контекста:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Order>()
        .HasKey(x => new { x.StudentId, x.EmployerId, x.CustomerId });
}

Когда я добавляюПосле новой миграции я вижу, что индекс StudentId был удален.И я не понимаю, почему?Мой новый снимок DbContext:

modelBuilder.Entity("DataInterface.Models.Order", b =>
{
    b.Property<Guid>("Id")
        .ValueGeneratedOnAdd()
        .HasColumnName("id");

    b.Property<string>("Description")
        .HasColumnName("description")
        .HasMaxLength(128);

    b.Property<Guid>("StudentId")
        .HasColumnName("student_id");

    b.Property<Guid>("EmployerId")
        .HasColumnName("employer_id");

    b.Property<Guid>("CustomerId")
        .HasColumnName("customer_id");

    b.HasKey("StudentId", "EmployerId", "CustomerId");

    b.HasIndex("EmployerId");

    b.HasIndex("CustomerId");

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

Почему был удален один из трех индексов?Почему b.HasIndex("StudentId"); строка была удалена?Что не так?

Примечание. Я не вижу этой проблемы с составным ключом из двух полей в других таблицах.

Ответы [ 2 ]

3 голосов
/ 17 апреля 2019

Первичный ключ обеспечивается индексом.

StudentId - первый столбец в этом индексе.

Ему не нужен другой индекс, определенный для него (такой индекс будетпочти наверняка тоже бессмысленно, так как вполне вероятно, что индекс PK является кластеризованным индексом для таблицы, а некластеризованные индексы содержат столбцы PK на своих листьях)

1 голос
/ 17 апреля 2019

Дополнительный индекс на StudentId будет избыточным.Поскольку это первый столбец в вашем первичном ключе, поиск по StudentId может просто использовать его индекс.Точно так же поиск на StudentId + EmployerId может сделать то же самое.

В качестве примера, раньше это не было в случае с EF Core, и были созданы два индекса.Тот факт, что индекс теперь удаляется, означает, что это поведение было исправлено / оптимизировано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...