EF, как обновить таблицу присоединения ко многим - PullRequest
0 голосов
/ 18 марта 2011

У меня проблемы с получением Entity Framework 4 для обработки массовых обновлений в m2m соединениях.У меня есть несколько много ко многим соединениям в моей модели, например что-то вроде

ПрактикаPracticeID PKИмя ...

PracticeSpecialties (присоединиться к таблице)PracticeID PKSpecialtyID PK

СпециальностиSpecialtyID ПКНазвание...

Довольно простой и EF 4 справляется с этим.Моя проблема в том, что мне нужно иметь возможность «объединить» две или более специальности в одну, например «Педиатрия» и «Дети» и «Подростки» должны быть одним и тем же элементом.Поэтому, если в Pediatrics значение SpecialtyID равно 1, а Children = 3 и Adolescents = 9, запрос должен обновить все строки в PracticeSpecialties, где SpecialtyID IN (3, 9), и изменить значение на 1.

. Я могунаписать сохраненный процесс, который будет обновлять, сделать это для всех строк в объединяющей таблице, содержащей один из нежелательных SpecialtyID, затем удалить все потерянные в настоящее время специальности, но, если возможно, я пытаюсь придерживаться шаблона EF.

Любое руководство приветствуется.

Ответы [ 2 ]

2 голосов
/ 18 марта 2011

В структуре сущностей вы должны сделать это способом объекта = вы можете просто изменить таблицу соединений. Вы должны работать с объектами в свойствах навигации. Ваш сценарий будет выглядеть так:

var children = context.Specialities.Include("Practices")
                      .Single(s => s.Name == "Children");
var pediatrics = context.Specialities.Include("Practices")
                        .Single(s => s.Name == "Pediatrics");

foreach (var practice in children.Practices)
{
  pediatrics.Practices.Add(practice);
}

children.Practices.Clear();
context.Specialities.DeleteObject(children);
context.SaveChanges();

Вы также должны переопределить Equals и GetHashCode в Practice сущности и использовать HashSet для Speciality.Practices (в случае POCO). Он будет обрабатывать дубликаты для вас.

Результатом этого будет многократное удаление и вставка в соединительную таблицу. Это EF способ сделать это.

0 голосов
/ 18 марта 2011

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

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...