2012-01-04 6 views
1

私のモデルでは、カテゴリと製品の2つのクラスがあります。それらの間には多くの関係があります。コンテキストに既存のエンティティを追加する

すべてのカテゴリの状態を手動で変更し、saveChanges()の前にデバッガで監視したところ、これらのカテゴリはすべて変更済みとしてマークされていました。しかし、カテゴリと製品の間の要求マッピングは、私のデータベースでは更新されませんでした。更新機能のコード。

public void UpdateProduct(Product product) 
    { 
     using (EFDbContext context = new EFDbContext()) 
     { 
      context.Products.Attach(product); 
      if (product.Categories != null) 
      { 
       foreach (var item in product.Categories) 
       { 
        context.Entry(item).State = EntityState.Modified; 
       } 
      } 
      context.Entry(product).State = EntityState.Modified; 

      context.SaveChanges(); 
     } 
    } 

答えて

2

変更するエンティティには、プロパティ(ナビゲーションプロパティではない)を変更して保存しておく必要があります。たとえば、既存の製品とカテゴリの間に新しい関係を作成したり、既存の製品とカテゴリの設定状態との関係を削除したりしてリレーションシップ(ナビゲーションプロパティ)を変更した場合、変更されても役立ちません。これは実際にはvery hard to solveです(現在のすべてのEFバージョンで同じです)。その関係には設定する必要のある独自の状態があり、関係の状態はModified =関係を追加または削除する必要があります。エンティティをコンテキストにアタッチしようとしたときに、あなたはおそらくCategoriesナビゲーションプロパティから削除した関係に関する情報を持っていないので、特に削除は難しいです。さらにDbContextdoesn't offer access to state of the relationですので、ObjectContextに変換してObjectStateManagerを使用する必要があります。

この問題を解決する最も簡単な方法は、保存された添付グラフを使用して、分離したオブジェクトグラフ(現時点で保存しようとしているもの)を保存して手動で同期する前にデータベースからカテゴリを含む製品を読み込むことです。添付されたグラフのすべての変更を同期すると、データベースに保存されます。添付されたグラフは、カテゴリが追加または削除された関係を知ることができます。

関連する問題