我有以下代码。
//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表达式明确搜索起始段不为空的故事,我不认为这是有道理的。
任何人都可以帮助我吗?
答案 0 :(得分:3)
这是懒惰/急切的负担问题。
实际上Story.StartSegment不为空。
但你没有包含它(通过急切加载)。试试这个..
var story = container.StorySet
.Include("StartSegment ")
.FirstOrDefault(s => s.StartSegment != null);
假设您的权利关系是这样的..
StorySet (很多)-----(0或1) StartSegment
StartSegment定义为StorySet的“NavigationProperty”。并且您生成的查询看起来像
SELECT * FROM StorySet WHERE StorySet.StartSegmentId is not null
此查询返回一些现有实体。 但默认情况下,在您明确告知之前,EF不会创建导航属性的瞬间.Include(“StartSegment”)
答案 1 :(得分:1)
请尝试以下代码:
var story = container.StorySet.Where(s => s.StartSegment != null).FirstOrDefault();
答案 2 :(得分:0)
我认为这是DB bool逻辑相关的问题。在SQL中,这不是真的:someNullValue = NULL
。相反,您应该使用someNullValue IS NULL
。在这种情况下,EF可能并不关心正确的空值比较,因此它只返回第一个元素,该元素可能为null StartSegment
。检查它是否已发布到数据库的查询。它应该有IS NULL
谓词,而不是= NULL