1

我究竟做错了什么?我使用向导映射了一个 SQL 服务器数据库。这是一个相当复杂的数据库,但对于这个示例,我们可以假设三个表:REPORTROWS、REPORTCOLUMNS 和 REPORTNAMES。REPORTROWS 具有以下列 ID、RESULT、REPORTDATE、REPORTCOLUMNID、REPORTNAMEID。REPORTNAMES 和 REPORTCOLUMNS 是带有 ID 和 NAME 的非常简单的表。ID 始终是主键,REPORTCOLUMNSID 和 REPORTNAMESID 是将 REPORTROWS 与 REPORTCOLUMNS 和 REPORTNAMES 链接的外键。

现在我用有效值填充三个表(我没有违反任何外键约束)。当我调用以下代码时

var recs = from a in ctx.REPORTROWS
           where a.REPORTNAMES.NAME == "my report" && a.REPORTDATE == somedate select a;

我得到了我想要的行,但是我不能在后面的代码中使用字段 a.REPORTCOLUMNS 因为它是空的!为什么?REPORTCOLUMNID 被定义为一个不可为空的整数(这就是它是外键的原因)。但是,字段 a.REPORTNAMES 是正确的。即使我添加&& a.REPORTCOLUMNS != null到查询中,a.REPORTDATE 仍然为空。

我已经看到了类似问题的链接,但我找不到明确的答案。任何人都可以帮助我。供您参考,我使用的是 .NET Framework 3.5,在映射数据库时无法检查向导中的“包含外键”。它是灰色的(我仍然不明白为什么)。

非常感谢提前

这是EF版本v2.0.50727

4

1 回答 1

0

您的 REPORTCOLUMNS(我相信您的 REPORTNAMES)表也应该在您的上下文中表示为实体,对吗?我认为发生错误是因为未启用延迟加载,并且您没有在查询中显式获取 reportcolumns 实体属性。

您可以尝试以下代码或类似代码:

var recs = from a in ctx.REPORTROWS.Include(r => r.REPORTCOLUMNS)
           where a.REPORTNAMES.NAME == "my report" && a.REPORTDATE == somedate select a;

主要是在执行查询时执行“包含”方法来获取 Reportcolumn 实体及其属性。

另一种选择是在映射到 REPORTCOLUMNS 主键的 REPORTROWS 实体中显式指定 REPORTCOLUMNID 属性。您应该能够执行“reportrow.REPORTCOLUMNID”来获取关联的reportcolumn 实体的ID,但在再次查询之前您将无法获取其他属性。

于 2013-01-09T08:23:37.857 回答