如何从使用实体框架的外键链接的多个表中获取所有数据?

Posted

技术标签:

【中文标题】如何从使用实体框架的外键链接的多个表中获取所有数据?【英文标题】:How to get all data from multiple tables linked by foreign keys with Entity Framework? 【发布时间】:2019-09-01 21:05:05 【问题描述】:

我是 Entity Framework 的新手,无法从以下数据库中获取所有数据:

我为上面显示的所有实体创建了控制器,如下所示:

    // Retrieve entire DB
    AareonAPIDBEntities dbProducts = new AareonAPIDBEntities();

    // Get all customers
    [System.Web.Http.AcceptVerbs("GET")]
    [System.Web.Http.HttpGet]
    [System.Web.Http.Route("customer")]
    public IEnumerable<Customer> Default()
    
        List<Customer> customers = dbProducts.Customers.ToList();
        return customers;
    

    //Get customer by ID
    [System.Web.Http.AcceptVerbs("GET")]
    [System.Web.Http.HttpGet]
    [System.Web.Http.Route("customer/id")]
    public Customer getById(int id = -1)
    
        Customer t = dbProducts.Customers
                               .Where(h => h.customerID == id)
                               .FirstOrDefault();
        return t;
    

现在我无法找出如何通过customerID 检索表PropertyLeaseContract 中由外键链接的所有数据库数据。我试图获得一个 JSON 响应,其中我得到 customersID 和值,其中包含来自链接的 LeaseContractProperty 的对象数组。

希望有人能提供帮助。

提前致谢!

【问题讨论】:

你可能想检查docs.microsoft.com/en-us/ef/ef6/querying/related-data 【参考方案1】:

假设您的关系在 DbContext 配置中正确设置,并且您的实体类中有适当的导航属性,它应该像这样工作:

public Customer getById(int id = -1)

    Customer t = dbProducts.Customers
            .Where(h => h.customerID == id)
            .Include(x => x.PropertyLeaseContracts)
              .ThenInclude(x => x.LeaseContract)
            .Include(x => x.PropertyLeaseContracts)
              .ThenInclude(x => x.Property)
            .FirstOrDefault();
    return t;

为此,您的客户类需要具有 PropertyLeaseContract 的集合属性并设置为 OneToMany 关系。 并且您的 PropertyLeaseContract 类需要具有 LeaseContract 和 Property 类型的属性,并且还需要正确设置。

编辑: 上述代码仅适用于 @TanvirArjel 提到的 Entity Framework Core。 在 Entity Framework 中完整的代码应该是这样的:

public Customer getById(int id = -1)

    Customer t = dbProducts.Customers
            .Where(h => h.customerID == id)
            .Include(x => x.PropertyLeaseContracts.Select(plc => plc.LeaseContract))
            .Include(x => x.PropertyLeaseContracts.Select(plc => plc.Property))
            .FirstOrDefault();
    return t;

【讨论】:

.ThenInclude(x =&gt; x.LeaseContract) 是在 EF Core 中新引入的,而不是在 EF 6.x 中。 我已经尝试过了,我收到以下错误:“IQueryable 不包含 'ThenInclude' 的定义,并且没有扩展方法 'ThenInclude' 接受 IQueryable 类型的第一个参数 可以找到。” 正如@TanvirArjel 提到的,这只能在实体框架核心中实现。我将用完整的实体框架代码附加答案。

以上是关于如何从使用实体框架的外键链接的多个表中获取所有数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 CodeIgniter 3 中的外键从表中获取列数据

无法从实体框架的引用表中检索数据

尝试使用 Laravel 中的外键从数据库中提取多行

如何编写一个查询,根据 ms 访问的子表中的外键获取信息?

可以使用实体框架在另一个表中调用两次作为外键的主键吗?

无法从 Laravel Vue 通讯录项目中的外键表中获取数据