1

这是我的课程(我使用的是 Entity Framework 5;.Net Framework 4.0):

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


[NotMapped]
public List<RolePrompt> RolePrompts { get; set; }

[NotMapped]
public List<RoleFeature> RoleFeatures { get; set; }
}

public class RolePrompt
{
  public int RolePromptId{get;set;}
  public int RoleId{get;set;}
  public int PromptId{get;set;}

  public Role Role{get;set;}
}

public class RoleFeature
{
  public int RoleFeatureId{get;set;}
  public int RoleId{get;set;}
  public int FeatureId{get;set;}

  public Role Role{get;set;}
}

我将如何加载一个角色对象,其中所有子对象都填充了一个 db 调用?我知道如何通过多个存储库调用来做到这一点。

Role role = roleRepository.Find(roleId);
role.RolePrompts = rolePromptsRepository.FindByRoleId(roleId); 
role.RoleFeatures = roleFeaturesRepository.FindByRoleId(roleId);

... 等等

上面的代码多次调用数据库。我希望在一个数据库调用中使用 RolePrompts 和 RoleFeatures 加载 Role 对象。

4

2 回答 2

0

我创建了一个小助手方法来做到这一点。

public virtual IQueryable<T> Include(params Expression<Func<T, object>>[] includes)
{
    IQueryable<T> dbQuery = context.Set<T>();

    // Apply eager loading
    foreach (Expression<Func<T, object>> inc in includes)
    {
        dbQuery = dbQuery.Include<T, object>(inc);
    }

    return dbQuery.AsNoTracking();
}

'context' 是我为我的类设置的一个属性,它保存了当前的 DbContext

然后你可以通过这样做来调用它

var myData = context.Roles.Where(x => x.RoleId == roleid).Include("RolePrompts", "RoleFeatures")
于 2013-09-23T14:05:40.527 回答
0

根据您的评论:

Role 和 Feature 表存在多对多关系,而 Role 和 Prompts 表存在一对多关系。

你需要这个类结构:

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

    public virtual ICollection<RoleFeature> RoleFeatures { get; set; }

    public virtual ICollection<RolePrompt> RolePrompts { get; set; }
}

public class RolePrompt
{
    public int RolePromptId { get; set; }

    public virtual Role Role { get; set; }
}

public class RoleFeature
{
    public int RoleFeatureId { get; set; }

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

modelBuilder.Entity<Role>()
.HasMany(r => r.RoleFeatures).WithMany(f => f.Roles)
.Map(t => t.MapLeftKey("RoleId")
    .MapRightKey("RoleFeatureId")
    .ToTable("RoleRoleFeatures"));

这将为您提供此表结构:

表结构

然后你可以继续使用Include来加载PromptsFeatures.

于 2013-09-23T20:04:43.503 回答