2

外部キーを使用して複合インデックスを追加したときに、EF が外部キーのインデックスを削除したことに気付きました。したがって、複合インデックスをよりよく理解する必要があります:)

この回答を使用して複合インデックスを追加し、EF コードの最初の移行ファイルを生成しました。

複合インデックスの追加:

this.Property(x => x.Name)
    .HasUniqueIndexAnnotation("IX_UniqueNamePerKey", 0);
this.Property(x => x.TeacherId)
    .HasUniqueIndexAnnotation("IX_UniqueNamePerKey", 1);

移行ファイル:

public partial class CompositeIndex : DbMigration
{
    public override void Up()
    {
        DropIndex("dbo.Course", new[] { "TeacherId" });
        CreateIndex("dbo.Course", new[] { "Name", "TeacherId" }, unique: true, name: "IX_UniqueNamePerKey");
    }

    // omitted...
}

理解できないのは、外部キーのインデックスを削除する必要がある理由です。私の知る限り、プロパティは複数のインデックスで問題なく使用できます。では、なぜ落とされるのでしょうか。それは結合を遅くしませんか?

モデル:

public class Course
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int TeacherId { get; set; }
    public virtual Teacher { get; set; }
}

public class Teacher
{
    public int Id { get; set; }
    public ICollection<Course> Courses { get; set; }
}

マッピング:

public class CourseMap : EntityTypeConfiguration<Course>
{
    protected CourseMap()
        {
            // Primary key
            this.HasKey(t => t.Id);

            // Properties
            this.Property(x => x.Name)
                .IsRequired()
                // below code was added
                .HasUniqueIndexAnnotation("IX_UniqueNamePerKey", 0);
            this.Property(x => x.ForeignKeyId)
                .HasUniqueIndexAnnotation("IX_UniqueNamePerKey", 1);

            // Table & Column Mappings
            this.ToTable("Course");
        }
}
4

1 に答える 1

1

私はそれがEFのバグであるという結論に達しました。

ただし、私の特定のケースでは、回避策は複合インデックスで最初に外部キーを作成することです。最初は通常のインデックスとして機能します。少なくともこれを正しく読めば。

于 2014-09-26T11:56:24.753 に答える