Ошибка при первом коде отношения ManyToMany - PullRequest
0 голосов
/ 26 марта 2019

У меня возникли проблемы с отношением «Многие ко многим» со связанной таблицей в Entity-Framework V6.Я использую MySql в качестве базы данных и уже получаю всегда одну и ту же ошибку.

Я пробовал много tuto на 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 -igration [имя] не проблема.Но когда я пытаюсь сделать обновление базы данных, Visual Studio выдает мне эту ошибку: неверный формат входной строки.(переведите, потому что я французский, а моя IDE на французском)

У кого-нибудь есть решение?Спасибо!

1 Ответ

0 голосов
/ 27 марта 2019

Я не знаком с MySQL, но общий подход к решению таких проблем во время выполнения состоит в том, чтобы использовать профилировщик для базы данных SQL для извлечения SQL, который EF пытается запустить, а затем проверить и выполнить этот запрос вручную по базе данных.надеюсь раскрыть, в какую колонку запутывается 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) С присоединяющейся сущностью она становится 1-ко-многим-1 в отношении отображения 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 устанавливает отношения между Student / Course и StudentCourse как 1-ко-многим в каждом случае.

...