2011-10-19 3 views

答えて

18

Findは、指定されたキーを持つエンティティがすでにコンテキスト内にあるかどうかをまずチェックします。そうでなければ、データベースに照会します。可能であれば、SingleOrDefaultを使用してLINQクエリを使用します。 SingleOrDefaultSELECT TOP 2に変換され、結果に複数のエンティティが含まれている場合は例外がスローされます。

FindFirstOrDefault(これはSELECT TOP 1に変換されます)を使用しないのはなぜですか。私は分かりませんが、Findはエンティティが実際にデータベース内で一意であることを確認したいと思います。クエリーが使用するプライマリキーなので、データベース内の主キーは変更されたため、モデルとデータベースが同期しない可能性があります。

本当に仮説です。 EF開発チームだけがおそらく正確な理由を答えることができます。

編集

私は上記のようにこれを行う(DBにおける複合キーに列を追加し、最初のキー列に同じ値を持つレコードを追加)し、その後Findを呼び出す場合、私は例外を取得します。

..

シーケンスは、複数の要素

...と、このスタックトレースが含まれています

//... 
System.Linq.Queryable.SingleOrDefault[TSource](IQueryable`1 source) 
System.Data.Entity.Internal.Linq.InternalSet`1.FindInStore(
    WrappedEntityKey key, String keyValuesParamName) 
System.Data.Entity.Internal.Linq.InternalSet`1.Find(Object[] keyValues) 
System.Data.Entity.DbSet`1.Find(Object[] keyValues) 

したがって、Findは実際にSingleOrDefaultを使用しているようです。

+0

私はLinqPadとVSでSingleOrDefaultを実行すると決してSELECT TOP 2を取得しません。それはEF特有ですか? –

+0

@JamieRRytlewski:これはEFのケースです。それがEF専用かどうかはわかりません。何を試しましたか? LINQ to SQL? – Slauma

+0

はい私はLinqをSqlに使用しました。違いがあります。私はいくつかの読書をしていたようで、それはEFだけに現れているように見えます。 TOP2を持っているのは理にかなっていますが、私はEFを使わないので見たことがありません。 –

関連する問題