0

我有两个非常简单的 POCO,我想通过一对多关系进行连接

public class Menu
{
    public int MenuId { get; set; }
    public bool IsActive { get; set; }
    public ICollection<MenuMember> MenuMembers { get; set; }
}

public  class MenuMember
{
    public int MenuMemberId { get; set; }
    public int MenuId { get; set; }
    public string  ViewRoute { get; set; }
    public bool IsActive{ get; set; }
}

public  class EFDbContext : DbContext
{
    public DbSet<Page> Pages { get; set; }
    public DbSet<Menu > Menus { get; set; }
    public DbSet<MenuMember> MenuMembers{ get; set; }
}

现在我要做的很简单,但是我互联网上的所有资源都令人惊讶地如此模糊(或者我太笨了)

我想为

SELECT * 
FROM Menu INNER JOIN MenuMembers 
    ON Menu.MenuId = MenuMembers.MenuId 
WHERE Menu.MenuId = 1

我用过这个

IEnumerable<Menu> menu 
    = repository.Menus.Where(x => x.MenuId == menuId);

但是当我迭代它时,它menu.MenuNumbers保持为空。我相信这是某种延迟加载问题。

4

2 回答 2

1

您需要声明MenuMembersvirtual

public virtual ICollection<MenuMember> MenuMembers { get; set; }
于 2013-05-02T11:07:47.640 回答
1

Include()手动加载关系以进行急切加载:

实体框架加载相关实体

急切加载是对一种类型实体的查询也加载相关实体作为查询的一部分的过程。急切加载是通过使用Include方法实现的。

IEnumerable<Menu> menu = repository.Menus
                                   .Include(m => m.MenuMembers)
                                   .Where(x => x.MenuId == menuId);

或者将属性标记为virtualEntity Framework 将延迟加载它:

延迟加载是在第一次访问引用实体的属性时自动从数据库加载实体或实体集合的过程。使用 POCO 实体类型时,通过创建派生代理类型的实例,然后覆盖虚拟属性以添加加载钩子来实现延迟加载。

public class Menu
{
    public int MenuId { get; set; }
    public bool IsActive { get; set; }
    public virtual ICollection<MenuMember> MenuMembers { get; set; }
}

还有其他一些选项,请务必查看文档

于 2013-05-02T11:13:51.963 回答