2012-08-06 69 views
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来不使用延迟加载?或者我错过了一些让它工作的东西?

+1

可能重复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

回答

2

你可以加载收集之后还有:

var user = ctx.Users.Find(1); 
    ctx.Entry(user).Collection(u => u.Roles).Load(); 
[实体框架自动负载渴望(的