多对多关系代码优先时出错



我在实体框架 V6 上的关联表的多对多关系方面遇到了一些问题。 我使用MySql作为数据库,并且已经总是遇到相同的错误。

我在youtube,stackoverflow,entityframeworktutorial,entityframework文档上尝试了许多tuto,但是当我尝试建立多对多关系时,我总是遇到相同的错误。

我使用 .NET 4.7.2 框架、MySQL 5.7.24、实体框架 6、MySql Connector 8.0.15、MySql.Data 6.10.8.0、MySQl.Data.Entity.EF6 6.10.8.0

这是我的第一个实体:

[Table("course")]
public class Course
{
[Key]
[Column("idcourse")]
public int Id { get; set; }
[Column("name")]
public string Name { get; set; }
public virtual ICollection<StudentCourse> Students { get; set; }
}

我的第二个实体:

[Table("student")]
public class Student
{
[Key]
[Column("idstudent")]
public int Id { get; set; }
[Column("name")]
public string Name { get; set; }
// Important - virtual
public virtual ICollection<StudentCourse> Courses { get; set; }
}

还有我的表:

[Table("student_course")]
public class StudentCourse
{
[Key]
[Column("idstudent_course")]
public int Id { get; set; }
[Column("idstudent")]
[ForeignKey("Student")]
public int StudentId { get; set; }
[Column("idcourse")]
[ForeignKey("Course")]
public int CourseId { get; set; }
[Column("coursescore")]
public int CourseScore { get; set; }
public virtual Student Student { get; set; }
public virtual Course Course { get; set; }
}

当我宣布添加迁移 [名称] 没有问题。但是当我尝试做一个更新数据库Visual Studio时,给我这个错误:输入字符串格式不正确。(翻译,因为我是法语,我的IDE是法语)

有人有解决方案吗? 谢谢!

我不熟悉 MySQL,但解决此类运行时问题的常规方法是针对 SQL 数据库使用探查器来提取 EF 尝试运行的 SQL,然后针对数据库手动检查和执行该查询,希望能揭示 EF 混淆的列。

您是否对学生和课程之间的关系使用任何其他配置?要检查的一件事是检查任何现有的多对多映射,或者如果不存在则添加它。EF 可以自动映射多对多,但 AFAIK 它需要某些约定,例如期望联接表具有组合键。

你可以尝试摆脱额外的PK:

[Table("student_course")]
public class StudentCourse
{
[Key, Column("idstudent", Order = 0)]
[ForeignKey("Student")]
public int StudentId { get; set; }
[Key, Column("idcourse", Order = 1)]
[ForeignKey("Course")]
public int CourseId { get; set; }
[Column("coursescore")]
public int CourseScore { get; set; }
public virtual Student Student { get; set; }
public virtual Course Course { get; set; }
}

通常,EF 希望在多对多中自动管理联接表,你甚至不声明联接实体。这将期望学生具有课程集合,而课程具有学生集合。这样做的缺点是,您将失去有关加入实体的任何额外信息的可用性。(课程成绩)对于联接实体,就 EF 的映射而言,它将成为 1 对多对 1,因此可能需要通过联接表显式映射关系。(通过 EntityTypeConfiguration 或 OnModelCreate 事件。

modelBuilder.Entity<Student>.HasMany(x => x.Courses).WithRequired(x => x.Student);
modelBuilder.Entity<Course>.HasMany(x => x.Students).WithRequired(x => x.Course);

这可确保 EF 将学生/课程和学生课程之间的关系设置为单向一对多。

最新更新