簡體   English   中英

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

[英]Saving changes to child collections with Entity Framework

我已經對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();
    }
}

謝謝,彼得維京人! :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM