我在与实体框架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是法语)
有人有解决方案吗? 谢谢!
答案 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之间的关系设置为一对多。