实体框架:如果引用列是标识列,则无法创建级联外键.无法创建约束或索引



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

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.

从本质上讲,我试图从考试结果表中指向学生课程记录,但由于某种原因它失败了。有人知道吗?

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

解决方案是通过流畅的 API 显式配置所需的关系:

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

请注意,这将在引用StudentCourse的复合 PKExamResult创建一个可选的复合 FK。如果要通过StudentCourse的备用键关联,则应使用HasPrincipalKeyAPI进行配置:

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

最新更新