Ошибка при первом коде отношения ManyToMany

у меня возникли проблемы с отношением «многие ко многим» со связанной таблицей в 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; }
}

Когда я запускаю добавление-миграцию [имя], проблем нет. Но когда я пытаюсь обновить базу данных, Visual Studio выдает мне эту ошибку: формат входной строки неверен. (переведите, потому что я французский, а моя IDE на французском)

У кого-то есть решение? Благодарить !

еще немного информации для исключения? Возможно, внутреннее исключение, трассировка стека или какая-либо часть запроса sql? это может помочь: stackoverflow.com/questions/49552550/…

tschmit007 26.03.2019 19:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
61
1

Ответы 1

Я не знаком с MySQL, но общий подход к решению подобных проблем во время выполнения заключается в использовании профилировщика для базы данных SQL для извлечения SQL, который пытается запустить EF, а затем проверки и выполнения этого запроса вручную для базы данных, чтобы, надеюсь, выявить в какой колонке EF путается.

Используете ли вы какую-либо другую конфигурацию для отношений между студентом и курсом? Одна вещь, которую нужно проверить, — это проверить любое существующее сопоставление «многие ко многим» или добавить его, если оно не существует. EF может автоматически сопоставлять «многие ко многим», но, насколько я знаю, он ожидает определенных соглашений, таких как ожидание того, что соединяемая таблица будет иметь составной ключ.

Вы можете попробовать избавиться от лишнего ПК:

[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-to-many в каждом направлении.

моя миграция продолжает говорить мне ту же ошибку, я не знаю, почему я не могу обновить свою базу данных, чтобы получить хорошую схему :(

Tom Flenner 28.03.2019 14:02

Другие вопросы по теме