实体框架:多对多关系

时间:2011-06-30 10:33:47

标签: asp.net entity-framework many-to-many repository-pattern

我有两个表具有多对多关系,如下所示:

用户(电子邮件地址,姓名)

UserAlerts(电子邮件地址 AlertId

警报(的 AlertId 下,标题)

警报已添加到数据库中。插入新用户时,我正在对AlertRepository进行查找。问题是,它不是仅在用户 UsertAlerts 表中创建记录,而是还添加了额外的警告记录。

我使用以下代码:

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 :(得分:0)

在提问之前,为什么不尝试搜索一下?每周多次询问此问题。在您之前的问题中,我说过您应该使用相同的上下文来加载Alert和存储User。你没有做到并且整个情况复杂化。

上下文对警报的存在一无所知。为用户致电Add后,它将添加尚未跟踪的所有实体。有三种方法可以解决这个问题:

  • 在两个存储库中使用相同的上下文,不要分离警报。由于加载警报,上下文将知道它们的存在并且不会再次插入它们。
  • 如果您不使用相同的上下文进行加载,则必须先将Alert附加到新上下文,然后再将其添加到User。将EF代码封装到存储库时很难做到。
  • 如果您不使用相同的上下文,并且在将Alert添加到User之前不会将Add附加到新上下文,则必须修改User User方法在将Unchanged添加到上下文后,您必须迭代每个警报并将其状态更改为{{1}}。