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
    }

但是,当我加载用户时,实体框架将 Roles 属性设置为 null。此外,当我加载角色时,用户属性运行良好,延迟加载。

如果我使用 Include,我可以让它工作,但我不想使用它。也因为我不能使用 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 假设默认情况下我们总是必须使用 Include 才能不使用延迟加载?或者我错过了一些让它工作的东西?

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 回答