Может ли Entity Framework обрабатывать отношения «многие ко многим» без объекта пересечения?

Использование первой модели базы данных: допустим, у нас есть классические таблицы Student, Course и StudentCourse (последние, очевидно, имеют FK для Student и Course).

Если вы импортируете эту модель в EF, вы получите объект, сгенерированный для каждой из них. Каждый из классов Student и Course будет иметь коллекцию StudentCourses, из которой вам нужно перейти к другому отношению, чтобы добраться до Course или Student соответственно.

Я хотел бы, чтобы код был сгенерирован таким образом, чтобы базовая таблица пересечений была невидимой, т.е. Student имеет набор Courses, а Course имеет набор Students. Я видел, как это делается в других программах ORM (в частности, TopLink). ). Можно ли это сделать в EF?


person Shaul Behr    schedule 27.11.2012    source источник
comment
Так что просто исключить модель table1table2?   -  person Brad Christie    schedule 27.11.2012
comment
Это, безусловно, возможно с кодом, поэтому я предполагаю, что это возможно с базой данных.   -  person Richard Deeming    schedule 27.11.2012
comment
Есть ли в вашей таблице StudentCourses дополнительные столбцы? Эта статья предполагает, что вы получите желаемое поведение, если это не так: learnentityframework.com/LearnEntityFramework/tutorials/   -  person Richard Deeming    schedule 27.11.2012
comment
@RichardDeeming - Хм, у меня нет других значимых столбцов, но у меня есть отдельное поле идентификатора с автоматической нумерацией. Строго говоря, я мог бы сделать составной ПК и убрать поле ID, если это необходимо...   -  person Shaul Behr    schedule 27.11.2012
comment
Из того, что я читал, удаление этого столбца сработает. В любом случае составной ПК обычно является лучшим выбором для такого рода таблиц.   -  person Richard Deeming    schedule 27.11.2012
comment
@RichardDeeming - ты прав, это работает. Пожалуйста, укажите это как ответ, чтобы я мог отдать вам должное. Спасибо!   -  person Shaul Behr    schedule 28.11.2012


Ответы (2)


В соответствии с этим руководством вы получите желаемое поведение, если ваша таблица StudentCourse содержит только столбцы внешнего ключа. Если он содержит какие-либо другие столбцы, EF создаст промежуточный объект для представления соединения.

В этом случае удаление суррогатного ключа из таблицы StudentCourse и замена его составным первичным ключом должно сработать.

person Richard Deeming    schedule 28.11.2012
comment
По сути, каждый раз, когда у вас есть дополнительный атрибут в отношении, вы получаете дополнительный объект в EF. Вам просто нужно думать о суррогатном ключе как об атрибуте. Другая сторона медали заключается в том, что если вам нужны атрибуты, эта дополнительная сущность просто необходима. (Вспомните об отношении Сотрудника к Должности, но у отношения ~ есть атрибут StartedOnDate. Таким образом, у вас должна быть эта дополнительная сущность. - person granadaCoder; 05.09.2014

Вы можете сделать это в EF Code First, используя ICollections. Например:

public class Student 
{ 
    public int ID { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Course> Courses { get; set; }

    public Student()
    {
        Courses = New HashSet<Course>();
    }
}

Повторите для курса и поменяйте местами все. Это создаст три таблицы в вашей базе данных (Student, Course и StudentCourse) с отношением m-to-m. Самое главное, StudentCourse будет невидимой связующей таблицей, которая не имеет Entity в вашей модели.

person markp3rry    schedule 27.11.2012
comment
В сети куча слухов по этому поводу. Самая полезная статья, которую я нашел, была написана Prashant. Брал. - person markp3rry; 27.11.2012
comment
Правильно, если ~отношение не имеет дополнительных атрибутов. Смотрите мой комментарий к ответу Ричарда. - person granadaCoder; 05.09.2014