如何使用Entity Framework查询多对多关系

时间:2017-05-23 10:55:50

标签: c# entity-framework linq

我的应用程序中有以下模型:

angular.module('app', []).
controller('MainController', ['$scope', function ($scope) {
      $scope.testExpand = function(){
            alert("testExpand is called to show");
            document.querySelector("maindiv").classList.add("maindivColor");
        } 
}]);

我想使用Entity Framework创建一个查询,从public class Employee { public int PersonId { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public int Benefits { get; set; } } public class Department { public int DeptID { get; set; } public string DeptName { get; set; } } public class DeptEmp { public int PersonID { get; set; } public int DeptID { get; set; } } 中选择所有列,条件是它只检索那些employeePersonId有关系的员工来自DeptId的{​​{1}}班级和DeptEmpDepartId中的Department有关系。

我写了以下LINQ语句:

DeptId

但它不起作用。我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

实体框架适用于"使用标准或其他"基础。如果您使用标准,这是相当容易的,如果不是,您必须提供有关您的偏差的大量信息。

例如,实体框架期望Employee的主键为Id或EmployeeId。如果您决定使用其他主键(PersonId),则必须告诉实体框架这是您的主键。

你的多对多关系也是如此。如果使用默认值,则相当容易,否则您需要使用属性或流畅的API来通知默认值的偏差。

您的员工/部门模型中的默认多对多将是:

另见Entity Framework Tutorial Configure many-to-many

public class Employee
{
    public int EmployeeId{ get; set; }

    public string  FirstName { get; set; }
    public string LastName { get; set; }
    public int Benefits { get; set; }

    // an employee has many departments:
    public virtual ICollection<Department> Departments { get; set; }
}

public class Department
{
    public int DeptartmentId { get; set; }
    public string DeptName { get; set; }

    // an department has many employees
    public virtual ICollection<Employee> Employees{ get; set; }
}

public MyDbContext : DbContext
{
    public DbSet<Employee> Employees {get; set;}
    public DbSet<Department> Departments {get; set;}
}

如果您使用这些类创建一个简单的控制台应用程序,您将看到它还创建了一个多对多表。您很少需要此表,但如果您真的需要它,可以将其添加到DbContext。

  

我希望...从员工中选择所有列,条件是它只检索PersonId与DeptId有关系的员工

我认为这意味着给定一个DeptId你想要所有员工在这个DeptId工作的所有财产:

using (var dbContext = new MyDbContext(...))
{
    var myDepartment = dbContext.Departments
        .Where(department => department.DepartmentId == DeptId)
        .SingleOrDefault();
    // I know there is at utmost one, because it is a primary key

    if (myDepartment == null) ShowDepartmentMissing(...);

    var employeesOfDepartment = myDepartment.Employees
        .Select(employee => new
        {
            FirstName = employee.FirstName,
            LastName = employee.LastName,
            Benefits = employee.Benefits,
        });