2012-02-24 16 views
3

私はEntity Frameworkをあまり使用していないので、私と一緒に裸にしてください。Entity Frameworkを使用して子コレクションに変更を保存する

私は別の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

私が理解する限り、管理コレクションの要素の親を効果的に変更しようとしています。 EFはあなたの意図を理解しようと努力しています。

同様の問題は、hereが利用可能でした。hereです。

+0

ありがとう@dmitry。 –

+0

あなたの質問に答えますか? –

+0

実際に@dmitryリソースは非常に有益でしたが、この場合は同じではありません。私は私のために働く解決策を投稿しました。 –

関連する問題