2

我有一个名为 Driver 的实体,要获取驱动程序列表,我调用:

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实体与 有外关系DetailDriver有一DetailId列是 Detail 表的外键,并且由于我使用的是 Entity Framework 3.5,因此无法访问Driver.Detail.Idor Driver.DetailId。他们不上来。我确实读过一些关于EF 3.5不包括外键然后可以选择的内容EF 4,但我现在还在EF 3.5

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

4

3 回答 3

0

我不熟悉 EF 3.5,但也许你可以这样处理:

context.drivers.Where(x => x.Detail == 
     context.Details.FirstOrDefault(d => d.Id == detailId))
于 2013-05-18T22:39:54.720 回答
0

你不能这样做_context.Where(),因为_contextis not IQueryable<Driver>

试试_context.Drivers.Where()吧。

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

public virtual ICollection<Detail> Details { get; set; }

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

public virtual Detail Detail { get; set; }

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

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

var driversWithDetails = _context.Drivers
                                 .Where(x => x.Id == id && x.Detail.Id == detailId)
                                 .Include (x => x.Detail).ToList();
于 2013-05-19T02:00:44.720 回答
0

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

于 2013-05-18T22:29:04.417 回答