2012-02-24 78 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