web-dev-qa-db-ja.com

Entity FrameworkのEagerLoadはデータを返しませんが、LazyLoadはデータを返します

最初にコードを使用していますEF5そしてvirtual(遅延読み込み)として定義されたコレクションを持つオブジェクトがあります。これにより、呼び出されたときにデータが返されます。しかし、私はそれが熱心にロードされることを望みます。プロパティシグネチャからvirtualを削除しましたが、常にnullデータを返します。 EFはクエリを実行しません、誰か助けてもらえますか?

編集:私は.include()について知っています。それを行うには非仮想プロパティメソッドを使用したいだけです。

オブジェクト

User[Key] IDは、personクラスの親であるResourceオブジェクトにあります):

namespace Entities
{
    [Table("Users")]
    public class User : Person
    {

    [Required]
    public ICollection<Role> Roles { get; set; } 

    }
}

役割:

namespace Entities
{
    public class Role
    {
        [Key]
        public string Id { get; set; }

        public virtual ICollection<User> Users { get; set; } 
    }
}
16
Barry

これはよくある混乱です。遅延読み込みの反対は次のとおりです。no load nless明示的に自分で読み込みを行います(たとえば、Includeを使用して積極的に読み込みます)。

したがって、何らかの方法で遅延読み込みをオフにした場合(virtual修飾子を削除することもその1つです)、動作は熱心な読み込みにはなりません。 )しかし読み込みなし

考えてみてください。EFが遅延読み込みのマークが付いていないものすべてを熱心に読み込むと仮定します。 1つの簡単なクエリを実行するだけで、データベースの半分をロードするリスクがあります。

方法はありません デフォルトでナビゲーションプロパティを積極的にロードする方法があります(上記を読んだ後でもそれが必要な場合)。

39
Gert Arnold

Includeメソッドを使用して、積極的な読み込みでエンティティ内のICollectionの読み込みを強制する必要があります。次のリンクが役立つ場合があります: http://msdn.Microsoft.com/en-us/data/jj574232.aspx

2
Abhishek Punj