2012-03-18 20 views
0

当我使用外键为空(虽然它不是)使用LINQ

 
var s = db.sModels.ToList().First(r => r.Status == CustomStatus.Available); 

获取第一个可用的项目。

但是,在获取时,s中的外键变为null

我已连接到数据库,看到外键不是null(但是是1)。

为什么它变成null

+1

为什么在'First'之前调用'.ToList()'?这可能不是你问题的根源,但这是一种浪费的努力。 – 2012-03-18 16:26:00

+0

@Tim S.否则会有一个不支持的异常。 (LINQ to Entities不支持指定的类型成员'状态',只支持初始值设定项,实体成员和实体导航属性。) – 2012-03-18 16:43:40

回答

4

假设这是LINQ到实体 - 这是默认的行为 - 如果你想兑现相关的实体 - 假设SomeEntity您可以使用Include查询在这种情况下,FK和实体将被填充:

var s = db.sModels.Include(r=> r.SomeEntity) 
        .First(r => r.Status == CustomStatus.Available); 

一种解决办法是W/O使用包含查询只是检索FKS看到这个博客帖子:"Getting Foreign Key Values with Linq-to-Entities"

正如在这个问题LINQ的注释,以实体不支持现在因此上述枚举实际上没有注意到按原样工作。作为一种解决方法(直到EF 5),您现在可以在DB上使用整数:

int statusAvailable = (int) CustomStatus.Available; 
var s = db.sModels.Include(r=> r.SomeEntity) 
        .First(r => r.Status == statusAvailable); 
+0

不可思议!你会介意进一步告诉我为什么默认情况下外键是'null'吗? – 2012-03-18 16:49:29

+1

只是EF团队的一个设计决定,我想 - 同样EF 5将提供对枚举的支持,所以你不应该需要你的解决方法'toList()' - 这将是一个性能拖累。在此之前,我会在数据库上使用整数值,而不是实现* all *结果。 – BrokenGlass 2012-03-18 16:59:44