的关系无法被改变..外键的属性是不可为空

问题描述:

我试图更新其已经exsit在DB型MamConfiguration_V1的关系无法被改变..外键的属性是不可为空

的实体

它有几个参考成员(其中MamConfigurationToBrowser_V1

private void UpdateEfItem(MamConfiguration_V1 itemFromDb, MamConfiguration_V1 itemFromUi) 
    { 
     itemFromDb.UpdatedDate = DateTime.Now; 

     itemFromDb.Description = itemFromUi.Description; 

     itemFromDb.StatusId = itemFromUi.StatusId; 

     itemFromDb.Name = itemFromUi.Name; 

     itemFromDb.NumericTraffic = itemFromUi.NumericTraffic; 

     itemFromDb.PercentageTraffic = itemFromUi.PercentageTraffic; 

     itemFromDb.Type = itemFromUi.NumericTraffic; 


     itemFromDb.MamConfigurationToBrowser_V1.Clear(); 



     for (int i = 0; i < itemFromUi.MamConfigurationToBrowser_V1.Count; i++) 
     { 
      var elementToAdd = itemFromUi.MamConfigurationToBrowser_V1.ElementAt(i); 

      elementToAdd.Browser = mMaMDBEntities.Browsers.Single(browserItem => browserItem.BrowserID == elementToAdd.BrowserID); 

      elementToAdd.MamConfiguration_V1 = itemFromDb; 

      itemFromDb.MamConfigurationToBrowser_V1.Add(elementToAdd); 
     } 

}

我得到以下DB运行时错误:

操作失败:无法更改关系,因为一个或多个外键属性不可空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新的关系,必须为外键属性指定另一个非空值,或者必须删除不相关的对象。

但这很奇怪。所有引用不为空:

enter image description here

enter image description here

UPADTE 2:

我曾尝试这样的代码:

 try 
     { 
      item.ThrowIfNull("item"); 

      var itemFromDB = GetById(item.ConfigurationId); 

      if (itemFromDB != null) 
      { 
       UpdateEfItem(itemFromDB, item); 

       //mMaMDBEntities.MamConfiguration_V1.Detach(itemFromDB); 

       //mMaMDBEntities.MamConfiguration_V1.Attach(item); 

       //mMaMDBEntities.ObjectStateManager.ChangeObjectState(item, System.Data.EntityState.Modified); 

       //mMaMDBEntities.ObjectStateManager.ChangeObjectState(itemFromDB, System.Data.EntityState.Modified); 


       mMaMDBEntities.SaveChanges(); 

       return item; 
      } 

}

 private void UpdateEfItem(MamConfiguration_V1 itemFromDb, MamConfiguration_V1 itemFromUi) 
     { 
      itemFromDb.UpdatedDate = DateTime.Now; 
      itemFromDb.Description = itemFromUi.Description; 
      itemFromDb.StatusId = itemFromUi.StatusId; 
      itemFromDb.Name = itemFromUi.Name; 
      itemFromDb.NumericTraffic = itemFromUi.NumericTraffic; 
      itemFromDb.PercentageTraffic = itemFromUi.PercentageTraffic; 
      itemFromDb.Type = itemFromUi.NumericTraffic; 

      foreach (var item in itemFromDb.MamConfigurationToBrowser_V1.ToList()) 
      { 
       if (itemFromUi.MamConfigurationToBrowser_V1.All(b => b.BrowserVersionId != item.BrowserVersionId)) 
       { 
        mMaMDBEntities.MamConfigurationToBrowser_V1.DeleteObject(item); 
       } 
      } 

      for (int i = 0; i < itemFromUi.MamConfigurationToBrowser_V1.Count; i++) 
      { 
       var element = itemFromUi.MamConfigurationToBrowser_V1.ElementAt(i); 
       var item = itemFromDb.MamConfigurationToBrowser_V1.SingleOrDefault(b => b.BrowserVersionId == element.BrowserVersionId); 
       if (item != null) 
       { 
        // copy properties from element to item 
       } 
       else 
       { 
        element.Browser = mMaMDBEntities.Browsers.Single(browserItem => 
         browserItem.BrowserID == element.BrowserID); 

        element.MamConfiguration_V1 = itemFromDb; 

        //have also tried: element.MamConfiguration_V1 = null; 

        //element.MamConfiguration_V1Reference = null; 

        itemFromDb.MamConfigurationToBrowser_V1.Add(element); 
       } 
      } 
     } 

去这个错误:

{"Violation of UNIQUE KEY constraint 'UQ_MamConfigurations_V1'. Cannot insert duplicate key in object 'dbo.MamConfiguration_V1'. The duplicate key value is (elad_14Apr_1315).\r\nThe statement has been terminated."}

这条线......

itemFromDb.MamConfigurationToBrowser_V1.Clear(); 

...不但清除收集也是集合中设置从单个项目的参考父母itemFromDbnull。这是对这些项目的修改,EF会尝试将它们保存到数据库中。它失败,因为(可能)参考是必需的,不能是null

必须采取不同的方法,那就是通过一个更新的一个集合中的项目。您必须考虑到项目可能已在UI中删除,它们可能已被修改,并且新项目可能已被添加。这将类似于此:

private void UpdateEfItem(MamConfiguration_V1 itemFromDb, 
    MamConfiguration_V1 itemFromUi) 
{ 
    itemFromDb.UpdatedDate = DateTime.Now; 
    itemFromDb.Description = itemFromUi.Description; 
    itemFromDb.StatusId = itemFromUi.StatusId; 
    itemFromDb.Name = itemFromUi.Name; 
    itemFromDb.NumericTraffic = itemFromUi.NumericTraffic; 
    itemFromDb.PercentageTraffic = itemFromUi.PercentageTraffic; 
    itemFromDb.Type = itemFromUi.NumericTraffic; 

    foreach (var item in itemFromDb.MamConfigurationToBrowser_V1.ToList()) 
    { 
     if (!itemFromUi.MamConfigurationToBrowser_V1.Any(b => 
      b.BrowserID == item.BrowserID) 
     { 
      mMaMDBEntities.Browsers.DeleteObject(item); 
     } 
    } 

    for (int i = 0; i < itemFromUi.MamConfigurationToBrowser_V1.Count; i++) 
    { 
     var element = itemFromUi.MamConfigurationToBrowser_V1.ElementAt(i); 
     var item = itemFromDb.MamConfigurationToBrowser_V1 
      .SingleOrDefault(b => b.BrowserID == element.BrowserID); 
     if (item != null) 
     { 
      // copy properties from element to item 
     } 
     else 
     { 
      element.Browser = mMaMDBEntities.Browsers.Single(browserItem => 
       browserItem.BrowserID == element.BrowserID); 

      itemFromDb.MamConfigurationToBrowser_V1.Add(element); 
     } 
    } 
} 
+0

我得到'mMaMDBEntities.SaveChanges()这个错误;':{“UNIQUE KEY约束 'UQ_MamConfigurations_V1' 违反无法插入对象 'dbo.MamConfiguration_V1' 重复键。重复的键值是(elad_14Apr_1315)\ r \ n此语句已终止“} – 2013-04-21 13:51:24

+0

@EladBenda:。做'itemFromUi.MamConfigurationToBrowser_V'集合中的项目有一个'MamConfigurations_V1'的参考?这将是一个问题,因为EF将尝试将它们与新项目一起插入。 – Slauma 2013-04-21 14:11:22

+0

是的。在EF参考导航中是双向的。并且'itemFromUi.MamConfigurationToBrowser_V'中的所有新项目都指向现有的'MamConfigurations_V1'。我该怎么办? – 2013-04-21 14:20:58