2011-01-17 2 views
3

Предположим, что мы имеем класс POCO для Entity Framework 4:Связанные записи загружены в 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/blog/article, я знаю, что это развевает/доказывает это), навигационное свойство может быть любого типа, если оно реализует ICollection<T>.

Оба HashSet<T> и SortedSet<T> реализуют ICollection<T>, поэтому либо были бы жизнеспособными кандидатами.

Вы прошли через код? Вы должны уметь видеть, какой конкретный класс получить разрешен.

Большинство людей используют ICollection<T>/IList<T>. Почему вы хотите объявить свойство как ISet<T>?

Почему бы вам просто не объявить, какой тип вы хотите, а не интерфейс.

Или вы можете попробовать использовать инъекцию зависимостей (For<ISet>().Use<HashSet>()).

+0

Отличный совет по проверке типа при отладке. Не уверен, почему я об этом не думал .. Похоже, что по умолчанию EF4 будет использовать HashSet над SortedSet. Также интересно, когда я перешел на IList , все сработало отлично. Поэтому я полагаю, что EF4 использует много отражений, так как в том, что является типом свойства класса, и объявляет экземпляр на основе этого. Было бы неплохо увидеть статью, объясняющую внутреннюю работу этого. – niaher

+0

@niaher - согласовано. Это не похоже на MVC, где мы можем посмотреть источник. :) Я знаю, что много EF POCO основано на конвенции. Я лично просто использую 'ICollection '. – RPM1984

Смежные вопросы