2013-04-21 39 views
1

我試圖更新其已經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."}

回答

3

這條線......

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

相關問題