【问题标题】:Entity Framework: Many to Many Relationship实体框架:多对多关系
【发布时间】:2011-06-30 10:33:47
【问题描述】:

我有两个这样的多对多关系表:

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

UserAlerts(emailaddress, AlertId)

警报(AlertId,标题)

警报已添加到数据库中。插入新用户时,我正在查找AlertRepository。问题是,它不仅在 UserUsertAlerts 表中创建记录,还添加了额外的 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();

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-01-28
      • 2011-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-13
      • 1970-01-01
      相关资源
      最近更新 更多