2

私はEFに比較的慣れていません。SaveChanges を呼び出した後、関連するテーブル データが利用できないようです。

User、Feature、および FeatureUser というテーブルを持つデータベースがあるとします。FeatureUser は、User レコードと Feature レコードを結び付けます。Feature オブジェクトを受け入れるメソッドがあり、FeatureUser テーブルに基づいて User.name 値をリストに入力します。これはうまくいきます:

using (var db = new projectModel())
{
  feature f = db.features.First();
  populateList(f);
}

private void populateList(feature f)
{
  foreach(featureuser fu in f.featureusers)
    addToList(fu.user.name);
}

上記のコードで重要な点は、FeatureUser テーブルの User テーブルへの組み込みリンクを介して User.name 値に戻ることです。うまくいかないのは、新しい FeatureUser レコードを作成して保存し、同じプロセスに従おうとすることです。

using (var db = new projectModel())
{
  feature f = db.features.First();
  foreach(int newuserid in somearray)
  {
    featureuser nfu = new featureuser();
    nfu.featureid = f.id;
    nfu.userid = newuserid;
    f.featureusers.add(nfu);
  }
  db.SaveChanges();
  populateList(f); // null reference error on fu.user.name
}

リレーションシップの作成に必要な外部キーを確立して保存したら、これらの便利な組み込みリレーションシップ コレクションをすべて解決するように EF に指示する方法はありますか?

4

1 に答える 1

9

EFによって返されるエンティティインスタンスは実際にはプロキシです。これらには、ナビゲーションプロパティを遅延ロードするロジックが含まれています。ただし、インスタンスを新しくした場合、featureuser遅延読み込みロジックがないため、そのロジックはありません。

したがって、代わりにEFにプロキシインスタンスを作成させます。

  foreach(int newuserid in somearray)
  {
    //create proxy instance
    var nfu = db.featureusers.Create();

    nfu.featureid = f.id;
    nfu.userid = newuserid;
    f.featureusers.add(nfu);
  }
于 2012-07-31T04:07:49.950 に答える