Entity framework: 无法在引用列是标识列的情况下创建级联外键。无法创建约束或索引

Entity framework: Cascading foreign key cannot be created where the referencing column is an identity column. Could not create constraint or index

我在尝试创建与数据透视表的一对一关系时遇到问题 table。这些是我的模型

    public class StudentCourse
    {
        public int Id { get; set; }
        public int StudentId { get; set; }
        public virtual Student Student { get; set; }
        public int CourseId { get; set; }
        public virtual Course Course { get; set; }
    }

    public class Student
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public virtual IList<StudentCourse> StudentCourses { get; set; }
    }

    public class Course
    {
        public int Id { get; set; }
        public string CourseName { get; set; }
        public string Description { get; set; }
        public virtual IList<StudentCourse> StudentCourses { get; set; }
    }

    public class ExamResult
    {
        public int Id { get; set; }
        public int Marks { get; set; }
        public int TotalMarks { get; set; }
        public virtual StudentCourse StudentCourse { get; set; }
    }

这是模型构建器配置,我在其中定义了学生和课程之间的多对多关系

            protected override void OnModelCreating(ModelBuilder modelBuilder)
            {
                modelBuilder.Entity<StudentCourse>().HasKey(sc => new { sc.StudentId, sc.CourseId });
                modelBuilder.Entity<StudentCourse>().HasAlternateKey(e => e.Id);
                modelBuilder.Entity<StudentCourse>().Property(e => e.Id).ValueGeneratedOnAdd();

                modelBuilder.Entity<StudentCourse>()
                    .HasOne(sc => sc.Student)
                    .WithMany(s => s.StudentCourses)
                    .HasForeignKey(sc => sc.StudentId)
                    .OnDelete(DeleteBehavior.Cascade);

                modelBuilder.Entity<StudentCourse>()
                    .HasOne(sc => sc.Course)
                    .WithMany(s => s.StudentCourses)
                    .HasForeignKey(sc => sc.CourseId)
                    .OnDelete(DeleteBehavior.Cascade);
            }

这是我在 运行 迁移

时收到的错误消息
Failed executing DbCommand (11ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
CREATE TABLE [StudentCourses] (
    [StudentId] int NOT NULL,
    [CourseId] int NOT NULL,
    [Id] int NOT NULL IDENTITY,
    CONSTRAINT [PK_StudentCourses] PRIMARY KEY ([StudentId], [CourseId]),
    CONSTRAINT [AK_StudentCourses_Id] UNIQUE ([Id]),
    CONSTRAINT [FK_StudentCourses_Courses_CourseId] FOREIGN KEY ([CourseId]) REFERENCES [Courses] ([Id]) ON DELETE CASCADE,
    CONSTRAINT [FK_StudentCourses_ExamResults_Id] FOREIGN KEY ([Id]) REFERENCES [ExamResults] ([Id]) ON DELETE CASCADE,
    CONSTRAINT [FK_StudentCourses_Students_StudentId] FOREIGN KEY ([StudentId]) REFERENCES [Students] ([Id]) ON DELETE CASCADE
);

Cascading foreign key 'FK_StudentCourses_ExamResults_Id' cannot be created where the referencing column 'StudentCourses.Id' is an identity column.
Could not create constraint or index. See previous errors.

基本上我试图从 ExamResult table 指向 StudentCourse 记录,但由于某种原因它失败了。有人知道吗?

这是一个 EF Core issue/bug,似乎已在 EF Core 3.0 中修复。 StudentCourse 的备用键 Id 以某种方式混淆了 EF Core 3.0 之前的关系约定,而不是预期的从 ExamResultStudentCourse 的多对一关系,它错误地假设了一个一对一关系,ExamResult 是主体,StudentCourse 是从属,因此 ExamResult 中缺少 FK,而 StudentCourse.

中的 FK 错误

解决方案是通过 fluent API:

明确配置所需的关系
modelBuilder.Entity<ExamResult>()
    .HasOne(e => e.StudentCourse)
    .WithMany();

请注意,这将在 ExamResult 中创建一个可选的复合 FK,引用 StudentCourse 的复合 PK。如果您想通过 StudentCourse 的备用键关联,您应该将其配置为 HasPrincipalKey API:

modelBuilder.Entity<ExamResult>()
    .HasOne(e => e.StudentCourse)
    .WithMany()
    .HasPrincipalKey(sc => sc.Id);