实体框架v5加载关系数据

本文关键字:关系 数据 加载 v5 框架 实体 | 更新日期: 2023-09-27 18:11:53

我有两个非常简单的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; }
}

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

我想为

写一个lambda表达式
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保持为空。

实体框架v5加载关系数据

Include()为手动加载的关系:

实体框架加载相关实体:

主动加载是这样一种过程:对一种实体类型的查询也会加载相关实体作为查询的一部分。动态加载是通过使用Include方法实现的。

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

或者将属性标记为virtual,这样实体框架将惰性加载它:

延迟加载是指在第一次访问指向实体的属性时自动从数据库加载一个实体或实体集合的过程。当使用POCO实体类型时,延迟加载通过创建派生代理类型的实例,然后重写virtual属性来添加加载钩子来实现。

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

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

您需要将MenuMembers声明为virtual

public virtual ICollection<MenuMember> MenuMembers { get; set; }