首次出现ManyToMany关系代码时发生错误

时间:2019-03-26 18:32:18

标签: entity-framework entity-framework-6

我在与实体框架V6上的关联表进行多对多关系时遇到了麻烦。 我将MySql用作数据库,并且已经得到始终相同的错误。

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

我使用.NET 4.7.2框架,MySQL 5.7.24,实体框架6,MySql连接器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; }
}

当我启动一个add-migration [name]时没问题。但是,当我尝试执行更新数据库时,Visual Studio出现此错误:输入字符串格式不正确。 (翻译是因为我是法语,而我的IDE是法语)

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

1 个答案:

答案 0 :(得分:0)

我不熟悉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希望在甚至不声明联接实体的情况下,在多对多的情况下自动管理联接表。这将期望学生拥有一系列课程,而该课程也拥有一系列学生。这样做的缺点是,您将失去加入实体上任何其他信息的可用性。 (CourseScore)对于连接实体,就EF的映射而言,它变成了一对多的关系,因此您可能需要通过连接表显式地映射关系。 (通过EntityTypeConfiguration或OnModelCreating事件。

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

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