Ado.Netエンティティ:オブジェクトがリンクメンバー(外部キー)が表示されません
-
09-09-2019 - |
質問
私は、単純なdatabaseschemeを持っています。ユーザーがアカウントを持つ1対多の関係を持っています。
私はado.netエンティティデータモデルを生成している、と私は、ユーザーとアカウントを作成し、さらにはそれらを一緒にリンクすることができます。 account.user_idが正しく充填されているデータベースでは、理論的にので、私はエンティティを介してC#で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...??
私は
??ここで何をしないのです解決
あなたはこのために ObjectQuery.Include のメソッドを使用する必要があります。あなたの方法でも動作しますが、追加のクエリになります。
あなたの例では、あなたが得るでしょう。
User user = db.User.Include("Account").First(u => u.id == 1);
あなたは、文字列"Account"
が正しいかどうかを把握する必要があります。通常はMyEntities
のようなものが付いてしなければなりません。これは、エンティティの名前空間ではなく、あなたがこれを理解することができるはず少し試行錯誤で異なります。
他のヒント
はい、それは、エンティティフレームワークの使用を開始する共通の問題だ - あなたが明示的にそれらをロードする必要がありますので、親も子もない関係がロード怠け者です。あなたは、クラス/メソッドの間の周りのオブジェクトコンテキストを共有しようとしている場合は、関係がすでにロードされているかどうかを確認するためのチェックをしたいかもしれません。
例えば。
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を使用して、あなたも親の参照関係のためにこれを使用することができます - 。例えば
account.UserReference.EnsureLoaded();
rwwildenが言うように、あなたはいつも子供をロードしようとしている場合は、この場合の親を持つオブジェクト、通話をより効率的にし、データベースへの余分処理を避けるために含める使用する場合があります。
私は私の知識は、フレームワークの少し小さいですね。 :)
あなたは明示的に最初の関連アカウントをロードする必要があります。
user.Account.Load();
今では正しく表示されない。