[英]Saving changes to child collections with Entity Framework
我已經對EntityCollection進行了更改,這是另一個EntityCollection的對象,當我嘗試保存這些更改時,我收到以下錯誤:
EntityCollection已經初始化。 只應調用InitializeRelatedCollection方法在對象圖的反序列化期間初始化新的EntityCollection。
任何想法我可能會失蹤?
以下是我使用的代碼。
public void UpdateCompanyManagement(Company newCompany)
{
Company oldCompany = entities.Companies.Where(c => c.COM_ID == newCompany.COM_ID).SingleOrDefault();
oldCompany.Managements = newCompany.Managements;
try
{
entities.SaveChanges();
}
catch (OptimisticConcurrencyException)
{
entities.Refresh(RefreshMode.ClientWins, newCompany.Managements);
entities.SaveChanges();
}
}
我可以使用以下代碼成功保存父集合:
public void UpdateCompanyDetails(Company newCompany)
{
Company oldCompany = entities.Companies.Where(c => c.COM_ID == newCompany.COM_ID).SingleOrDefault();
entities.ObjectStateManager.ChangeObjectState(oldCompany.city, System.Data.EntityState.Modified);
oldCompany = newCompany;
try
{
entities.SaveChanges();
}
catch (OptimisticConcurrencyException)
{
entities.Refresh(RefreshMode.ClientWins, oldCompany);
entities.SaveChanges();
}
}
經過大量研究,我在我的數據庫/模型設置中發現了一個問題(因為我使用的是遺留數據庫)。 我的數據庫中的大多數表都沒有主鍵,而那些沒有主鍵的表沒有身份規范,這導致了問題。 所以我更正了數據庫並更新了我的模型。
而且,我最終找到了一種編寫干凈EF代碼的簡單方法。
兩個函數中的代碼可以重寫如下:
public void UpdateCompanyManagement(Company company, int mgmtID)
{
var management = company.Managements.Where(m => m.M_ID == mgmtID).SingleOrDefault();
management.name = "new name";
management.position = "new position";
// edit all you want, then save
// no further code is required
// except you've done something wrong somewhere
try
{
entities.SaveChanges();
}
catch (OptimisticConcurrencyException)
{
entities.Refresh(RefreshMode.ClientWins, company);
entities.SaveChanges();
}
}
並且,
public void UpdateCompanyDetails(Company company)
{
company.name = "new company name";
company.address = "new company address";
// edit all you want then save
// no further code is required
// except you've done something wrong somewhere
try
{
entities.SaveChanges();
}
catch (OptimisticConcurrencyException)
{
entities.Refresh(RefreshMode.ClientWins, company);
entities.SaveChanges();
}
}
謝謝,彼得維京人! :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.