いくつかのEntity Frameworkアプリケーションの設計に取り掛かる前に、私はほんのいくつかのウェブキャストを見ました。それほど多くのドキュメントを読んでいなかったので、今は苦しんでいるように感じます。
私はクラスでList<T>
を使用してきましたが、うまく機能しました。
今、私はいくつかのドキュメントを読みましたが、ICollection<T>
を使用すべきだったと述べています。これに変更しましたが、モデルコンテキストの変更さえ引き起こしませんでした。これは、List<T>
とICollection<T>
の両方がIEnumerable<T>
を継承し、それがEFに実際に必要なものだからですか?
しかし、これが当てはまる場合、EFドキュメントではIEnumerable<T>
ではなくICollection<T>
が必要であると記載されていないのはなぜですか?
いずれにせよ、私がやったことの欠点はありますか、それを変更する必要がありますか?
Entity Frameworkは、ICollection<T>
インターフェイスの一部ではないAdd
操作をサポートする必要があるため、IEnumerable<T>
を使用します。
また、wereを使用してICollection<T>
であり、単にList<T>
実装として公開していることに注意してください。 List<T>
は、IList<T>
、ICollection<T>
、およびIEnumerable<T>
を伴います。
変更に関しては、List<T>
が機能しているにもかかわらず、インターフェースを介して公開することをお勧めします。インターフェイスはコントラクトを定義しますが、実装は定義しません。実装could変更。場合によっては、たとえば、実装はHashSet<T>
になります。 (ちなみに、これはEntity Framework以外にも使用できる考え方です。オブジェクト指向の実践としては、実装ではなくインターフェイスに向けてプログラミングすることです。実装は変更される可能性があります。
Linqを使用するときにEntity Frameworkが実行するマジッククエリを包括的に抽象化できるため、彼らが行ったインターフェイスを選択しました。
インターフェースの違いは次のとおりです。
IEnumerable<T>
は読み取り専用ですICollection<T>
にアイテムを追加および削除できますList<T>
への(インデックスによる)ランダムアクセスを行うことができますこれらのうち、ICollection
とIEnumerable
はデータベース操作にうまくマッピングされます。エンティティのクエリと追加/削除はDBで行うことができるためです。
既存のクエリ結果を反復処理する必要があるため、インデックスによるランダムアクセスもマッピングされません。そうしないと、各ランダムアクセスによってデータベースが再度クエリされます。また、インデックスは何にマップしますか?行番号?実行したい行番号クエリは多くありません。また、大きなクエリを作成する際にはまったく役に立ちません。そのため、彼らは単にそれをサポートしていません。
ICollection<T>
がサポートされており、データのクエリと変更の両方が可能になるため、それを使用します。
List<T>
が最初から機能する理由は、EF実装が最終的に1を返すためです。しかし、それはクエリチェーンの最後であり、最初ではありません。そのため、プロパティをICollection<T>
にすると、使用するLinqの各レベルに対してクエリを実行するのではなく、EFが一連のSQLを作成し、最後にList<T>
のみを返すことがより明確になります。
ICollectionはIEnumerableとは異なり、IEnumerableではできないのに対して、実際にコレクションに項目を追加できます。たとえば、POCOクラスでは、コレクションの追加を許可する場合にICollectionを使用します。 ICollectionを仮想化し、遅延読み込みの恩恵も受けます。
質問は何年も前に投稿されましたが、誰かが同じシナリオを探しているとき、それはまだ有効です。
最近の[2015] CodeProjectの記事には、サンプルコードによる詳細とグラフィック表示の違いについて説明しています。 EFに直接焦点を合わせているわけではありませんが、さらに大きな助けになることを願っています。
リストvs IEnumerable vs IQueryable vs ICollection vs IDictionary