我試圖更新其已經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運行時錯誤:
操作失敗:無法更改關係,因爲一個或多個外鍵屬性不可空。當對關係進行更改時,相關的外鍵屬性將設置爲空值。如果外鍵不支持空值,則必須定義新的關係,必須爲外鍵屬性指定另一個非空值,或者必須刪除不相關的對象。
但這很奇怪。所有引用不爲空:
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."}
我得到'mMaMDBEntities.SaveChanges()這個錯誤;':{「UNIQUE KEY約束 'UQ_MamConfigurations_V1' 違反無法插入對象 'dbo.MamConfiguration_V1' 重複鍵。重複的鍵值是(elad_14Apr_1315)\ r \ n此語句已終止「} – 2013-04-21 13:51:24
@EladBenda:。做'itemFromUi.MamConfigurationToBrowser_V'集合中的項目有一個'MamConfigurations_V1'的參考?這將是一個問題,因爲EF將嘗試將它們與新項目一起插入。 – Slauma 2013-04-21 14:11:22
是的。在EF參考導航中是雙向的。並且'itemFromUi.MamConfigurationToBrowser_V'中的所有新項目都指向現有的'MamConfigurations_V1'。我該怎麼辦? – 2013-04-21 14:20:58