【问题标题】:Error when ManyToMany relation Code first多对多关系代码优先时出错
【发布时间】:2019-03-26 18:32:17
【问题描述】:

我在与 Entity-Framework V6 上的关联表的多对多关系方面遇到了一些问题。 我使用 MySql 作为数据库,但总是遇到同样的错误。

我在 youtube、stackoverflow、entityframeworktutorial、entityframework 文档上尝试了很多教程,但是当我尝试建立多对多关系时,我总是遇到同样的错误。

我使用 .NET 4.7.2 Framework、MySQL 5.7.24、Entity Framework 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; }
}

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

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

【问题讨论】:

标签: entity-framework entity-framework-6


【解决方案1】:

我不熟悉 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的映射而言,它变成了1对多对1,因此您可能需要通过加入表显式映射出关系。 (通过 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 将 Student/Course 和 StudentCourse 之间的关系设置为一对多。

【讨论】:

  • 我的迁移一直告诉我同样的错误我不知道为什么我不能更新我的数据库以获得好的架构:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
  • 1970-01-01
相关资源
最近更新 更多