实体框架4.1 POCO - 多对多加载

cod*_*ove 2 c# many-to-many entity-framework poco

我有以下4个表(针对此问题进行了简化):


公司

CompanyId | 名称

雇员

EmpoyeeId | CompanyId | FirstName | 姓

允许

PermissionId | CompanyId | 允许

EmployeePermission

EmployeePermissionId | PermissionId | 员工ID


而POCO如下:

[Table("Employee")]
public class Employee
{
    public int EmployeeId { get; set; }
    public int CompanyId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public Company Company { get; set; }
    public List<Permission> Permissions { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我希望能够将公司和权限加载为Employee的属性.我可以使用以下代码加载公司:

var employee = _context.Employees
            .Where(u => u.EmpoyeeId == 1234)
            .Include(u => u.Company)
            .FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

不知道如何加载Permission集合.

Era*_*nga 5

您需要对数据库结构进行更改才能实现此目的.

您的EmployeePermission表应该只包含2个外键列.通过这样做,EF将透明地管理链接表,您可以PermissionsEmployee课堂上拥有属性.

更改Employee类定义以使导航属性成为虚拟.

[Table("Employee")]
public class Employee
{
    public int EmployeeId { get; set; }
    public int CompanyId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public virtual Company Company { get; set; }
    public virtual ICollection<Permission> Permissions { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以急切加载 Permissions

var employee = _context.Employees
            .Where(u => u.EmpoyeeId == 1234)
            .Include(u => u.Company).Include(u => u.Permissions)
            .FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)