使用实体框架保存对子集合的更改

本文关键字:子集合 保存 实体 框架 | 更新日期: 2023-09-27 18:25:38

我对EntityCollection进行了更改,该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();
    }
}

使用实体框架保存对子集合的更改

据我所知,您正在有效地尝试更改Management集合中元素的父级。EF很难理解你的意图。

类似的问题也在这里得到了解答。

经过大量研究,我在数据库/模型设置中发现了一个问题(因为我使用的是遗留数据库)。我数据库中的大多数表都没有主键,而那些有主键的表没有标识规范,这导致了问题。所以我修改了数据库并更新了我的模型。

而且,我最终找到了一种简单的方法来编写干净的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();
    }
}

谢谢,维京人彼得!:)