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 であるため、この単体テストは失敗しますが、開始セグメントが nullではないストーリーを明示的に検索する FirstOrDefault ラムダ式を考えると、これは意味がないと思います。

誰でも私を助けることができますか?

4

3 に答える 3

3

それは怠惰/熱心なロードの問題です。

実際、Story.StartSegment は null ではありません。

しかし、あなたはそれを含めませんでした(熱心なロードによる)。これを試して..

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

あなたのエンティティ関係がこのようなものであると仮定します..

StorySet (多数) ----- (0 または 1) StartSegment

StorySet の「NavigationProperty」として定義されたStartSegment。生成されたクエリは次のようになります

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 に答える