0

我有以下代码。

//I pick the first story where its StartSegment is not null.
var story = container.StorySet.FirstOrDefault(s => s.StartSegment != null);

if (story != null)
{

     //the following assert fails because story.StartSegment is null.
     Assert.IsNotNull(story.StartSegment,
                                         "The target story of this homework has no start segment.");

}

此单元测试失败,因为 story.StartSegment 实际上为 null,但鉴于 FirstOrDefault lambda 表达式明确搜索起始段不为 null的故事,我认为这没有任何意义。

谁能帮我?

4

3 回答 3

3

这是懒惰/急切的负载问题。

事实上 Story.StartSegment 不为空。

但你没有包括它(通过急切的加载)。试试这个..

var story = container.StorySet
    .Include("StartSegment ")
    .FirstOrDefault(s => s.StartSegment != null);

假设你的实体关系是这样的..

StorySet (many) ----- (0 或 1) StartSegment

StartSegment 定义为 StorySet 的“NavigationProperty”。你生成的查询看起来像

SELECT * FROM StorySet WHERE StorySet.StartSegmentId is not null

此查询返回一些现有实体。但默认情况下,除非您明确告诉.Include("StartSegment") ,否则EF 不会创建即时导航属性

于 2012-03-19T11:43:11.337 回答
1

试试下面的代码:

var story = container.StorySet.Where(s => s.StartSegment != null).FirstOrDefault(); 
于 2012-07-13T14:06:26.523 回答
0

我认为这是与 DB 布尔逻辑相关的问题。在 SQL 中这是不正确的:someNullValue = NULL. 相反,您应该使用someNullValue IS NULL. 在这种情况下,EF 可能不关心正确的 null 比较,所以它只返回第一个元素,它可能有 null StartSegment。检查向数据库发出的查询。它应该有IS NULL谓词,而不是像= NULL

于 2012-03-19T11:38:23.440 回答