【问题标题】:Saving changes to child collections with Entity Framework使用 Entity Framework 保存对子集合的更改
【发布时间】:2019-01-31 03:31:53
【问题描述】:

我对作为另一个 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();
    }
}

【问题讨论】:

    标签: c# asp.net entity-framework


    【解决方案1】:

    据我了解,您实际上是在尝试更改 Management 集合中元素的父级。 EF 很难理解你的意图。

    类似问题已回答here 可用here

    【讨论】:

    • 它回答了你的问题吗?
    • 实际上@dmitry 资源非常有用,但在这种情况下并不相同。我发布了一个对我有用的解决方案。
    【解决方案2】:

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

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

    谢谢,彼得维京人! :)

    【讨论】:

      猜你喜欢
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 2013-06-25
      • 2017-02-11
      • 1970-01-01
      • 1970-01-01
      • 2012-08-23
      • 1970-01-01
      相关资源
      最近更新 更多