3

最初にエンティティ フレームワーク コードを使用しており、遅延読み込みを使用しないようにコレクションをマークしたいと考えています。この概念が熱心な読み込みと呼ばれていることを知りません。しかし、これまでのところ、遅延読み込みを使用するには仮想属性を設定するだけでよいことがわかっています。ただし、遅延読み込みが必要ない場合は、仮想のままにしておく必要があります。

public class User
{
    public int Id { get; set; }
    public string Username { get; set; }

    public ICollection<Role> Roles { get; set; } // no virtual
}

public class Role
{
    public int Id { get; set; }
    public string Name { get; set; }

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

私の概念モデルでは、常にユーザーの役割が必要であり、遅延読み込みは必要ありません。そして、クエリで Include() を使用したくありません。その属性を常に利用できるようにしたいだけです。

    using (DataContext ctx = new DataContext(connectionString))
    {
        var role = ctx.Roles.Find(1);
        var users = role.Users; //lazy loading working            

        var user = ctx.Users.Find(1);

        var roles = user.Roles; //null exception
    }

しかし、ユーザーをロードすると、Entity Framework によって Roles 属性が null として返されます。また、ロールをロードすると、ユーザー属性は遅延ロードでうまく機能します。

インクルードを使用すれば機能しますが、使用したくありません。また、Find メソッドを使用できないためです。

var user = ctx.Users.Include(r => r.Roles).Find(1); //the find method is not accessible
var user = ctx.Users.Include(r => r.Roles).First(u => Id == 1); //I must use this way

だから、私は間違った方法を考えていますか?Entity Framework は、遅延読み込みを使用しないために常にインクルードを使用する必要があるとデフォルトで想定していますか? または、それを機能させるために何か不足していますか?

4

1 に答える 1

3

後でコレクションをロードすることもできます。

// Find the User entity with the given primary key value == 1
var user = ctx.Users.Find(1); 

// Loads the related Roles entities associated with the User entity
ctx.Entry(user).Collection(u => u.Roles).Load();
于 2012-08-06T19:44:09.310 に答える