Когда вы моделируете соединительную таблицу как сущность, вы действительно теряете прямое отношение «многие ко многим» между Consultant
и Program
. Вот как это работает. У вас будет прямое отношение «многие ко многим» или дополнительные свойства в соединительной таблице. Не оба. Если вы хотите и то и другое, вы можете попробовать создать собственное свойство Programs
для Consultant
и использовать запрос linq для получения связанных программ:
public IEnumerable<Program> Programs
{
get
{
return this.ConsultantProgramLinks.Select(l => l.Program);
}
}
Пример также является объяснением вашей последней проблемы. Вы не можете иметь свойство Program
в ConsultantProgramLink
, потому что это набор связанных сущностей, а не одна сущность (она должна называться ConsultantProgramLinks
). Свойство в сущности ConsultantProgramLink
называется просто Program
, поскольку оно представляет отдельную сущность, а не коллекцию.
Edit:
Если вам нужно, чтобы каждый Program
автоматически связывался с каждым Consultant
, вы должны применить его при создании нового Program
. Открытая соединительная таблица как отдельная сущность, вероятно, позволит вам легко ее достичь:
var program = new Program();
...
context.Programs.AddObject(program);
var ids = from c in context.Consultants
select c.Id;
foreach (var id in ids)
{
var link = new ConsultantProgramLink
{
ConsultantId = id,
Program = program
};
context.ConsultantProgramLinks.AddObject(link);
}
context.SaveChanges();
Если вы добавите новый Consultant
, вам придется одинаково создавать ссылки на все программы.
Недостатком является то, что если у вас есть, например, 1000 консультантов, эта конструкция создаст 1001 вставку базы данных, где каждая вставка будет выполняться в отдельном цикле туда-обратно к базе данных. Чтобы избежать этого, единственный вариант - использовать хранимую процедуру или триггер в таблице программ.