使用Entity Framework保存子集合的更改

4

我已经对另一个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();
    }
}
2个回答

2
据我所了解,您的实际目的是尝试更改Management集合中元素的父级。EF很难理解您的意图。类似的问题在这里被回答,也可以在这里找到答案。请注意保留HTML标签。

它回答了你的问题吗? - Dmitry Sevastianov
实际上,@dmitry提供的资源非常有用,但在这种情况下并不适用。我已经发布了一个对我有效的解决方案。 - Ibrahim Dauda

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

谢谢,维京人彼得!:)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接