0

2 つのエンティティがAlphaありBeta、互いに M:M の関係があります。

私はいくつかBetaの s をAlphalike に追加しようとしています:

public ActionResult Edit(Alpha alpha)
{
  if (ModelState.IsValid)
  {
    var selectedBetaIds = //populated from checkboxes in the view

    var selectedBetas = db.Betas.Where(b => selectedBetaIds.Contains(b.Id));

    alpha.Betas.Clear();

    foreach (var b in selectedBetas)
      alpha.Betas.Add(b);

    db.Entry(alpha).State = EntityState.Modified;
    db.SaveChanges();
    return RedirectToAction("Index");
  }
  return View(alpha);
}

ただし、テーブルAlphaBetasにはエントリが追加されておらず、alpha.Betas.Count() == 0.

奇妙なことにdb.SaveChanges()、上記の方法の後、デバッグ中に、Betas期待どおりにデータが取り込まれます。

4

1 に答える 1

1

プロパティalpha.Betasは遅延読み込みが有効になっている必要があります。つまり、仮想および遅延読み込みである必要があり、プロキシ生成がコンテキストでオフになっていてはなりません。

その理由は、その後の変更を検出できるように、EF が "古い" コレクションを認識している必要があるためです。

コレクションが遅延ロードの場合、ステートメントalpha.Betas.Clear();は最初にコレクションをロードし、すぐにクリアします。(alphaその時点でコンテキストにアタッチされている必要があります)。

遅延読み込みにしたくない場合は、最初に手動で読み込む必要があります。

context.Entry(alpha).Collection(x => x.Betas).Load();

アイテムを削除/追加する前に。

設定EntityState.Modifiedはスカラー プロパティにのみ影響するため (ナビゲーション プロパティには影響しません)、ジョブを実行しません。ステートメント自体に変更がない場合は、ステートメントを削除できますalpha。ただし、それでもalphaコンテキストにアタッチする必要があります。

于 2013-04-22T13:27:42.647 に答える