2012-02-24 113 views
3

我還沒有使用實體框架太多,所以請裸露在身邊。使用實體框架保存對子集合的更改

我已經修改了一個EntityCollection這是另一種EntityCollection, 的對象,當我嘗試保存這些更改,我得到以下錯誤:

The EntityCollection has already been initialized. The InitializeRelatedCollection method should only be called to initialize a new EntityCollection during deserialization of an object graph.

任何想法我可能會丟失?

以下是我使用的代碼。

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(); 
    } 
} 

任何幫助,爲什麼第一個代碼不工作,將不勝感激。 在此先感謝。

回答

0

經過大量研究後,我發現我的數據庫/模型設置中存在問題(因爲我使用的是舊數據庫)。我的數據庫中的大多數表沒有主鍵,而那些沒有主鍵,並且這導致了問題。所以我糾正了數據庫並更新了我的模型。

而且,我終於找到了一個簡單的方法來編寫乾淨的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(); 
    } 
} 

謝謝,彼得的海盜! :)

2

據我所知,您正在有效地嘗試更改Management集合中元素的父級。英孚很難理解你的意圖。

類似問題已回答here可用here

+0

謝謝@dmitry。 – 2012-02-29 10:03:19

+0

它回答你的問題嗎? – 2012-03-05 15:22:26

+0

其實@dmitry資源非常豐富,但在這種情況下不一樣。我發佈了一個適用於我的解決方案。 – 2015-12-19 06:07:43