外部キーを使用して複合インデックスを追加したときに、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");
}
}