2012-04-30 3 views
0

私は、結合された列の1つがNULL可能ですが、しばしば2つの行の間で唯一の識別項目となるビューを持っています。私は、EFがビュー内のnullableではないすべての項目から主キーを作成したことを確認します。私は、ビューから引き出すときに、このnull可能な列が常に正しく返されるわけではなく、キーにマップされている方法と関係があり、キーが見える場合は同じ行が返されることに気付きましたもう存在している。EFでビュー内のすべての行が返されるようにするにはどうすればよいでしょうか?

理想的な解決策は、私の列をnullにすることができないようにすることですが、大きな問題を引き起こすことなくそれを行うことはできません。

もう1つのアイデアは、ROW_NUMBER()を使用して主キーを作成することでした。私はそれが同様の問題を引き起こすかもしれないかどうかは不明です。(コール間でコンテキストがリフレッシュされていない場合、それはそれだけであるか、クエリが異なることを認識するのに十分スマートですか?)関数とそれが行の動的順序付けにどのように影響するかを示します。

パフォーマンスに与える影響が最も少ないSQLクエリで表示されるすべての行が確実に返されるようにするにはどうすればよいでしょうか?あまりにも、私は11を取得する必要があり

1, 2, null 
1, 3, 10 
1, 3, 10 

view: A int, B int, C int? 

SQL Results: 
1, 2, null 
1, 3, 10 
1, 3, 11 

EFのようなものを返します。

例..あなたに感謝します。

答えて

3

これはアイデンティティマップパターンのために発生します。デフォルトでは、EFは既にロードされているエンティティ(エンティティキーで識別される)を追跡します。 - 結果セットに繰り返しエンティティキーが含まれている場合、EFはすでにロードされているエンティティと同じエンティティであると判断し、レコードを繰り返す代わりに、そのキーを持つ最初のレコードに対して作成されたインスタンスを使用します。これは、変更の追跡と変更をデータベースに保存する機能に必要です。

あなたのケースでは、ほとんどの場合、これらのレコードが必要な情報を提供しないため、変更をデータベースに保存したくない場合があります。したがって、変更トラッキングを行わずにレコードをロードすると、IDマップパターンをスキップし、結果セット内のすべてのレコードに対して新しいエンティティインスタンスを生成する必要があります。

context.YourEntitySet.MergeOption = MergeOption.NoTracking; 
// Now execute your query 
+0

ありがとうございます。これは私が探していたトリックでした。私はhttp://msmvps.com/blogs/kevinmcneish/archive/2010/02/16/setting-entity-framework-mergeoptions-what-works-what-doesn-t.aspxにいくつかの良い情報が見つかった私のシナリオで。 – emragins

関連する問題