Entity Framework: отношения «многие ко многим» - PullRequest
0 голосов
/ 30 июня 2011

У меня есть две таблицы с отношением «многие ко многим», например:

Пользователь ( адрес электронной почты , Имя)

UserAlerts ( адрес электронной почты , AlertId )

Предупреждение ( AlertId , название)

Оповещения уже добавлены в базу данных. При добавлении нового пользователя я делаю поиск по AlertRepository. Проблема заключается в том, что вместо создания записи только в таблицах User и UsertAlerts добавляется дополнительная запись Alert .

Я использую следующий код:

public ActionResult Register(UserModel model, int[] Alerts)
User user = new MidTier.Models.User();
user.Name = model.Name;
user.EmailAddress = model.EmailAddress;    
if (Alerts!=null)
      {             
         IRepository<Alert> alertRepository = new AlertRepository();
         foreach (int alertId in Alerts)
            {
              Alert alert = alertRepository.First(a=>a.ID== alertId); 
              alertRepository.Detach(alert);  
               if (alert != null)
                  {
                    alert.Enabled = true; 
                      user.Alerts.Add(alert);
                   }                         
             }  

       }
  userRepository.Attach(user);
  userRepository.Add(user);
  userRepository.Save();

1 Ответ

0 голосов
/ 30 июня 2011

Почему бы вам не попытаться немного поискать, прежде чем задать вопрос? Эта проблема задается несколько раз в неделю. В вашем предыдущем вопросе я сказал вам, что вы должны использовать один и тот же контекст для загрузки Alert и хранения User. Ты этого не делал и усложнил всю ситуацию.

Контекст ничего не знает о существовании предупреждения. Как только вы позвоните Add для пользователя, он добавит все объекты, которые еще не отслежены. Есть три способа решить эту проблему:

  • Используйте один и тот же контекст в обоих репозиториях и не отключайте оповещения. Из-за загрузки предупреждений контекст узнает об их существовании и не вставляет их снова.
  • Если вы не используете один и тот же контекст для загрузки, вы должны прикрепить Alert к новому контексту, прежде чем добавить его в User. Это трудно сделать, когда вы переносите код EF в репозитории.
  • Если вы не используете тот же контекст и не добавите Alert к новому контексту, прежде чем добавить его в User, вы должны изменить свой метод Add для User и после добавления User к контексту вы должны выполнить итерацию каждого предупреждения и изменить его состояние на Unchanged.
...