我使用实体框架获得了一个不可为空的外键的null值

时间:2013-01-09 08:01:32

标签: c# entity-framework foreign-keys

我做错了什么?我使用向导映射了SQL Server数据库。这是一个相当复杂的数据库,但是对于这个例子我们可以假设三个表: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,因为它是null!为什么? REPORTCOLUMNID被定义为一个不可为空的整数(这就是为什么它是外键)。但是,字段a.REPORTNAMES是正确的。即使我向查询添加&& a.REPORTCOLUMNS != null,a.REPORTDATE仍为null。

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

提前多多感谢

这是EF版本v2.0.50727

1 个答案:

答案 0 :(得分: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;

主要是在执行查询时使用“Include”方法获取Reportcolumn实体及其属性。

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