144

最初にいくつかの Entity Framework アプリケーションの設計に取り掛かる前に、いくつかの Web キャストを見ただけでした。私はそれほど多くのドキュメントを読んでおらず、今は苦しんでいるように感じます.

List<T>私はクラスで使用してきましたが、うまくいきました。

今、私はいくつかのドキュメントを読みましたが、使用すべきだったと書かれていICollection<T>ます。これに変更しましたが、モデル コンテキストの変更も発生しませんでした。List<T>これはとICollection<T>inheritの両方が原因IEnumerable<T>であり、それが実際に EF に必要なものなのでしょうか?

ただし、これが事実である場合、EF のドキュメントでは、IEnumerable<T>代わりに必要であると述べられていないのはなぜICollection<T>ですか?

いずれにせよ、私が行ったことにマイナス面はありますか、それとも変更する必要がありますか?

4

4 に答える 4

147

Entity Framework は、インターフェイスの一部ではない操作ICollection<T>をサポートする必要があるため、使用します。AddIEnumerable<T>

使用していたことにも注意してください。実装ICollection<T>として公開しているだけです。、、およびをもたらします。List<T>List<T>IList<T>ICollection<T>IEnumerable<T>

変更に関しては、機能しているにもかかわらず、インターフェイスを介して公開することをお勧めしますList<T>。インターフェイスはコントラクトを定義しますが、実装は定義しません。実装変更される可能性があります。場合によっては、たとえば、実装が である可能性がありますHashSet<T>。(ちなみに、これは Entity Framework 以外にも使用できる考え方です。オブジェクト指向の優れたプラクティスは、実装ではなくインターフェイスに向けてプログラムすることです。実装は変更される可能性があり、変更される予定です。)

于 2011-10-05T01:59:37.200 に答える
72

彼らは、Linq を使用するときに Entity Framework が実行する魔法のクエリを理解しやすい抽象化を提供するため、彼らが行ったインターフェイスを選択しました。

インターフェースの違いは次のとおりです。

  • IEnumerable<T>読み取り専用です
  • にアイテムを追加および削除できます。ICollection<T>
  • へのランダムアクセス(インデックスによる)を行うことができますList<T>

これらのうち、エンティティのクエリICollectionIEnumerable追加/削除はDBで行う可能性があるため、データベース操作にうまくマップします。

反復する既存のクエリ結果が必要になるか、ランダム アクセスごとにデータベースを再度クエリする必要があるため、インデックスによるランダム アクセスも同様にマップされません。また、インデックスは何にマップされますか? 行番号?実行したい行数クエリは多くなく、より大きなクエリを構築するのにはまったく役に立ちません。したがって、彼らは単にそれをサポートしていません。

ICollection<T>がサポートされており、データのクエリと変更の両方ができるので、それを使用してください。

そもそも機能する理由List<T>は、EF 実装が最​​終的に 1 を返すことになるためです。ただし、これはクエリ チェーンの最初ではなく、最後にあります。したがって、プロパティを作成すると、使用する Linq の各レベルに対してクエリを実行するのではなくICollection<T>、EF が一連の SQL を作成し、最後に a のみを返すことがより明確になります。List<T>

于 2011-10-05T02:00:21.483 に答える
10

ICollection は、アイテムを実際にコレクションに追加できるという点で IEnumerable とは異なりますが、IEnumerable ではできません。したがって、たとえば POCO クラスでは、コレクションの追加を許可する場合は ICollection を使用する必要があります。ICollection を仮想化して、遅延読み込みの恩恵も受けます。

于 2011-10-05T02:01:13.563 に答える