2009-04-14 12 views
3

私は単純なデータベースです:ユーザー、アカウント。ユーザーはアカウントと1対多の関係を持っています。Ado.Netエンティティ:オブジェクトはリンクされたメンバー(外部キー)を表示しません

私はado.netエンティティデータモデルを生成しました。ユーザーとアカウントを作成し、それらをリンクすることもできます。データベースでは、account.user_idが正しく埋め込まれているので、理論的には、C#のEntityを通じてUser.Account.ToList()にアクセスできるはずです。

しかし、私がUser.Account.ToList()にアクセスしようとすると、結果はゼロになります。私は、以前のコードの前に次のコードを追加すると

User user = db.User.First(U => U.id == 1); 
List<Account> accounts = user.Account.ToList(); ##count = 0... 

それは突然私に正しい数2

Account account1 = db.Account.First(A => A.id == 1); 
Account account2 = db.Account.First(A => A.id == 2); 
User user = db.User.First(U => U.id == 1); 
List<Account> accounts = user.Account.ToList(); ##count = 2...?? 

を与える私はここで何をしないのです??

答えて

2

これにはObjectQuery.Includeメソッドを使用する必要があります。メソッドも機能しますが、追加のクエリが発生します。

あなたの例では、あなたは、文字列"Account"が正しいかどうかを把握する必要があり

User user = db.User.Include("Account").First(u => u.id == 1); 

になるだろう。通常、接頭辞はMyEntitiesのようにしてください。これはあなたのエンティティの名前空間に依存しますが、少し試行錯誤してこれを理解できるはずです。

1

私の知識はフレームワークのほんの少しだと思います。 :)

まず、関連するアカウントを明示的に読み込む必要があります。

user.Account.Load(); 

今正しく表示されます。

2

はい、Entityフレームワークの使用を開始する際によくある問題です。親関係と子関係のどちらも遅延ロードされないため、明示的にロードする必要があります。クラス/メソッド間でオブジェクトコンテキストを共有する場合は、関係が既にロードされているかどうかを確認することができます。

あなたは、単純な拡張メソッドでこれを簡単に行うことができます
if(!user.Account.IsLoaded) 
     user.Account.Load(); 

:もう一度、これはあなたの負荷のコールが短くなります使用して

public static class EntityExtensions 
{ 
    public static void EnsureLoaded(this RelatedEnd relatedEnd) 
    { 
     if (!relatedEnd.IsLoaded) 
      relatedEnd.Load(); 
    } 
} 

user.Account.EnsureLoaded(); 

そして、それはあるRelatedEndを、使用していますようにエンティティフレームワークの親と子の関係に共通ですが、これを親参照関係にも使用できます。 rwwildenが言うようにあなたはいつも子供が、この場合の親を持つオブジェクトをロードしようとしている場合

account.UserReference.EnsureLoaded(); 

は、あなたがコールをより効率的にし、データベースへの余分処理を避けるために含める使用する場合があります。

+0

ありがとうございました。 LINQ to SqlとNhibernateの後、子関係がロードされていないためにデバッグしている間に私は驚きました –

関連する問題