2011-01-17 5 views
3

たちはEntity Frameworkの4のためのPOCOクラスがあるとします。関連するレコードがHashSetまたはSortedSetにロードされていますか?

public class Order 
{ 
    public long Id { get; set; } 
    public ISet<OrderItem> OrderItems { get; set; } 
} 

、データベースから順序を取得するには、この方法:

public Order GetOrder(long orderId) 
{ 
    using (var context = new MyModelEntities()) 
    { 
     return context.Orders.Include("OrderItems").Where(order => order.Id == orderId).FirstOrDefault(); 
    } 
} 

だから、我々はこれを行うとします

Order myOrder = GetOrder(1); 

ですmyOrder.OrderItemsはHashSetまたはSortedSetですか?これを制御する方法はありますか?

+0

ところで、私は 'public long ISet 'はタイプミスですか? :) – RPM1984

+0

良い点。ありがとう:) – niaher

答えて

3

良い質問です。

私が知っている限り(MSDN /ブログ/記事はありませんが、これは紛失/判明しています)、ナビゲーションプロパティはICollection<T>を実装していればどんなタイプでもかまいません。

HashSet<T>およびSortedSet<T>のいずれもICollection<T>を実装しているため、どちらも実行可能な候補になります。

コードをステップ実行しましたか?どの具体的なクラスが解決されたかを見ることができるはずです。

ほとんどの人がICollection<T>/IList<T>を使用しています。なぜあなたはISet<T>とプロパティを宣言したいですか?

インターフェイスではなく、必要なタイプを宣言するだけです。

また、依存関係注入(For<ISet>().Use<HashSet>())を試してみることもできます。

+0

デバッグ時にタイプをチェックする優れたアドバイス。なぜ私はそれを考えていないのか分かりません。デフォルトでは、EF4はSortedSetよりもHashSetを使用するようです。興味深いことに、私がIListに変更したときすべてがうまくいきました。ですから、EF4で使用されているリフレクションがたくさんあると思います。クラスプロパティのタイプは何で、それに基づいてインスタンスを宣言します。 これの内部の仕組みを説明している記事を見てうれしいです。 – niaher

+0

@niaher - 同意します。ソースを見ることができるのはMVCのようなものではありません。 :)私は多くのEF POCOがコンベンションに基づいていることを知っています。私は個人的に 'ICollection 'を使うだけです。 – RPM1984

関連する問題