2014-09-10 94 views
3

我返回null 3个实体有多对多的连接(表):实体框架包括性能

public class AccUserRole 
{ 
    public long Id { get; set; } 
    public string RoleName { get; set; } 
    public List<AccAdGroup> Groups { get; set; } 
    public List<AccScreen> Screens { get; set; } 
} 

public class AccAdGroup 
{ 
    public long Id { get; set; } 
    public string AdIdent { get; set; } 
    public List<AccUserRole> Roles { get; set; } 
} 



public class AccScreen 
{ 
    public long Id { get; set; } 
    public string ScreenIdent { get; set; } 
    public List<AccUserRole> Roles { get; set; } 
} 

我想获得的所有角色(包括它们的屏幕和组)具有至少一个指定的组列表(当前用户的组)。所以我用这个查询:

List<AccUserRole> userRoles = (from ur in db.AccUserRoles.Include("Groups").Include("Screens") 
           from g in ur.Groups 
           where user.Groups.Contains(g.AdIdent) 
           select ur).ToList(); 

它得到正确的角色,但GroupsScreens属性为null。 EF看起来像使用Include和第二个from有问题。 任何有关如何包括属性或重写查询的帮助将不胜感激。

回答

1

尝试添加虚拟键字的类属性,像这样:

public class AccUserRole 
{ 
    public long Id { get; set; } 
    public string RoleName { get; set; } 
    public virtual List<AccAdGroup> Groups { get; set; } 
    public virtual List<AccScreen> Screens { get; set; } 
} 

public class AccAdGroup 
{ 
    public long Id { get; set; } 
    public string AdIdent { get; set; } 
    public virtual List<AccUserRole> Roles { get; set; } 
} 



public class AccScreen 
{ 
    public long Id { get; set; } 
    public string ScreenIdent { get; set; } 
    public virtual List<AccUserRole> Roles { get; set; } 
} 
2

移动ToList()之前包括。

select ur).Include("Groups").Include("Screens").ToList(); 

该子选择可以消除Include效应。

如果您正在进行急切加载,则不需要virtual关键字。 通过添加virtual,您正在使用延迟加载,而不是急切加载。

3

Earger加载

这样做的原因是,你只指定一个级别的包括,而你的查询要求在第二个层次的东西。

您的包含允许您请求ur.Groupsur.Screens。 下一级别是from g in ur.Groups,并且您没有包含该级别。 (这可能是意外的你,因为你已经在查询的第一部分要求所有AccUserRolse。)

当您运行查询,你可以在开始添加其他.include,深层去两个层次:

from ur in db.AccUserRoles 
      .Include("Groups") 
      .Include("Groups.Roles") 
      .Include("Screens") 

如果你需要去另一个层面,你只需要添加另一个包括:

from ur in db.AccUserRoles 
      .Include("Groups") 
      .Include("Groups.Roles") 
      .Include("Groups.Roles.Groups") 
      .Include("Screens") 

...等。

,如果你有一大堆的水平,以巢,这可能成为累赘,因此另一种是使用延迟加载代替,如Praval“肖恩” Tirubeni表明,加入virtual关键字来收藏您的实体。