3
我首先使用实体框架代码,并且我想标记一个集合以供使用不延迟加载。我不知道这个概念被称为渴望加载。但到目前为止,我知道我只需要为使用延迟加载设置虚拟属性。但是,如果我不想延迟加载,我应该不要虚拟。默认情况下,如何获取实体框架ICollection,没有延迟加载?
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
}
但是,当我加载用户,实体框架给我的角色属性为空。另外,当我加载一个角色时,用户属性效果很好,延迟加载。
如果我使用包含,我可以得到它的工作,但我不想使用它。还因为我不能使用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
那么,我在想错方法?实体框架在默认情况下假设我们必须使用Include来不使用延迟加载?或者我错过了一些让它工作的东西?
可能重复http://stackoverflow.com/questions/5001311/entity-framework-auto-eager-负载)和http://stackoverflow.com/questions/5955544/forcing-eager-loading-for-a-navigation-property – Slauma 2012-08-06 19:29:39