在 LINQ 中访问外键在哪里?

Posted

技术标签:

【中文标题】在 LINQ 中访问外键在哪里?【英文标题】:Access foreign key in LINQ Where? 【发布时间】:2013-05-13 19:08:34 【问题描述】:

我有一个名为 Driver 的实体,为了获取 Drivers 列表,我调用:

List<Driver> drivers = _context.Drivers.Select(x=>x);

驱动程序可以有详细信息,它们是它们之间的外键,但我不能这样做:

List<Driver> drivers = _context.Where(x=>x.id == id && x.Detail.id == detailId);

如何在 Where 子句中访问我的外键属性?

我正在使用Entity Framework 3.5

该语句有效,虽然我不确定 (x=>x) 是否必要,但我还没有实际编译它:

List<Driver> drivers = _context.Drivers.Select(x=>x);

问题是Driver 实体与Detail 有外关系,Driver 有一个DetailId 列,它是 Detail 表的外键,因为我使用的是 Entity Framework 3.5,所以我可以不能到达Driver.Detail.IdDriver.DetailId。他们不上来。我确实读过一些关于EF 3.5 的内容,不包括外键,然后可以在EF 4 中进行选择,但我现在在EF 3.5 上。

我确实尝试过.Include("Detail"),但它给了我一些关于Detail not being a navigation property.的例外

【问题讨论】:

我不明白这个问题。它不让你做什么?你的代码目前给你什么错误? 你的第二个 Linq 语句有什么问题? 你能展示你的Driver类吗? 那(你的第二行)实际上创建了正确的 SQL - 使用 EF 最直观的通常是正确的方法。你一定有其他东西不起作用。 @NSGaga - 我添加了一些细节。 【参考方案1】:

在您的情况下使用Include 方法。参考MSDN

【讨论】:

【参考方案2】:

我不熟悉 EF 3.5,但也许你可以这样解决它:

context.drivers.Where(x => x.Detail == 
     context.Details.FirstOrDefault(d => d.Id == detailId))

【讨论】:

抱歉,我修复了一些代码。如果有帮助,我会添加更多细节。【参考方案3】:

您不能使用_context.Where(),因为_context 不是IQueryable&lt;Driver&gt;

改用_context.Drivers.Where()

您最好的线索是您收到的关于Detail 的错误消息不是导航属性;尝试将一个添加到 Driver 实体 - 如果它是 1 个驱动程序:许多细节:

public virtual ICollection<Detail> Details  get; set; 

如果是 1 个驱动程序:1 个详细信息:

public virtual Detail Detail  get; set; 

在 .dbml 中,您可以使用 关联 指定那些;如果您从现有数据库导入模型,则 FK 应该作为 associations 导入,但如果它们没有(或者如果数据库没有定义它们),您可以随时手动添加它们。

使用导航属性,EF 应该能够评估如下内容:

var driversWithDetails = _context.Drivers
                                 .Where(x => x.Id == id && x.Detail.Id == detailId)
                                 .Include (x => x.Detail).ToList();

【讨论】:

我认为 public virtual Detail / ICollection&lt;Detail&gt; 部分仅适用于 EF 4.1 代码优先。对于 EF 3.5,我相信这一切都在 .dbml 中。

以上是关于在 LINQ 中访问外键在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

mysql进阶 十一 外键在数据库中的作用

访问不为 MySQL 链接表导入关系

Laravel:当我的外键在数组中时,如何在模型中添加关系?

CakePHP 3外键在视图中

我应该使用外键在 SQL 中显示树关系吗

外键在一对多关系中始终为空 - Spring Boot Data with JPA