2

さて、私はADO.NETEntityFrameworkを使用するための最初の試みを行っています。

私のテストケースには、現在、メンバーとプロファイルの2つのテーブルがあり、1:1の関係にあるSQLServer2008データベースが含まれています。

次に、エンティティデータモデルウィザードを使用して、データベースからEDMを自動生成しました。正しい関連付けのモデルを生成しました。今私はこれをしたい:

ObjectQuery<Member> members = entities.Member;
IQueryable<Member> membersQuery = from m in members select m;
foreach (Member m in membersQuery)
{
   Profile p = m.Profile;
   ...
}

どちらがうまくいくか。私はすべてのメンバーを繰り返すことができます。しかし、私が抱えている問題は、m.Profileが常にnullであるということです。MSDNライブラリのLINQtoEntitiesの例は、そのようなナビゲーション関係をシームレスにたどることができることを示唆しているようですが、そのようには機能していないようです。entity.Profile.ToListを使用するなど、何らかの方法で最初にプロファイルを別の呼び出しでロードすると、m.Profileは有効なプロファイルを指すことがわかりました。

だから私の質問は、フレームワークにナビゲーション関係に沿ってデータを自動的にロードするように強制するエレガントな方法がありますか、それとも結合などで明示的にそれを行う必要がありますか?

ありがとう

4

3 に答える 3

6

さて、ここで必要な答えを見つけることができましたhttp://msdn.microsoft.com/en-us/magazine/cc507640.aspx。次のクエリは、Profile エンティティが読み込まれていることを確認します。

IQueryable<Member> membersQuery = from m in members.Include("Profile") select m;
于 2008-10-06T05:36:45.993 に答える
1

私はこの手法を 1 対多の関係で使用し、うまく機能しました。私は Survey クラスと、その一部として別のデータベーステーブルから多くの質問を持っており、この手法を使用して関連する質問を抽出することができました...

context.Survey.Include("SurveyQuestion").Where(x => x.Id == id).First()

(コンテキストは生成された ObjectContext です)。

context.Survey.Include<T>().Where(x => x.Id == id).First()

これを行うための拡張メソッドをまとめようとして10分を費やしただけです。私が思いつくことができる最も近いものは...

    public static ObjectQuery<T> Include<T,U>(this ObjectQuery<T> context)
    {
        string path = typeof(U).ToString();
        string[] split = path.Split('.');

        return context.Include(split[split.Length - 1]);
    }

改善のための指針は大歓迎です:-)

于 2008-11-30T20:48:10.707 に答える
1

もう少し調査を行うと、これが見つかりました...私の拡張メソッドの試みよりもはるかに優れているFuncリンクへの投稿があるStackOverflowリンク:-)

于 2008-11-30T21:13:14.697 に答える