2009-09-03 3 views
10

Мои вопросы, вероятно, очень просты, как вы загружаете детей/подклассы. Нет никакой «нагрузки» или чего-то подобного, что я могу найти, чтобы контекст загружал детей.Entity Framework 3.5 - Как загрузить детей

класс контекст типа ObjectContext, смотрите ниже:

public partial class RTIPricingEntities : global::System.Data.Objects.ObjectContext 

Продукт

Product.ModifiedByUser (как загрузить этот класс, при загрузке продукта ??)

продукта . Категория (как загрузить категории при загрузке продукта?)

+0

Вот пример того, как Im загружает данные: Возможно, я должен был упомянуть, что я кодирую это для приложения silverlight. И это через службу доменов. RTIPricingContext _context = new RTIPricingContext(); LoadOperation op = _context.Load (context.GetPurchaseOrderQuery(), PurchaseOrdersLoadedCallback, null); частная пустота PurchaseOrdersLoadedCallback (LoadOperation ло) { IEnumerable ро = lo.Entities.Where (ш => w.UserID == SelectedUser.ID); // Это сборник, который мне нужно заполнить подклассы. – Jukeman

ответ

16

Вы можете нетерпеливая нагрузка:

var q = from p in Context.Products 
        .Include("ModifiedByUser") 
        .Include("Category") 
     select p; 

... или проект:

var q = from p in Context.Products 
     select new 
     { 
      Id = p.Id, 
      Name = p.Name 
      ModifiedByUserName = p.ModifiedByUser.Name, 
      CategoryName = p.Category.Name 
     } 

Преимущество проекции вы получите только необходимые вам данные, а не все каждый ссылочного объекта. Преимущество активной загрузки заключается в том, что возвращаемые объекты отслеживают изменение. Выберите правильную технику для проблемы.

Update

Да, это важно отметить, что вы используете RIA Services. Я полагаю, вы также работаете в клиенте. Это делает вещи полностью разных.

В службах RIA очень важно убедиться, что вы возвращаете весь граф объектов, которые вам требуются при начальной загрузке. Вы не хотите называть что-то вроде .Load() для объекта, потому что это будет еще один горячий сервер, что плохо для производительности. Если вы находитесь, например, в Silverlight-клиенте и запрашиваете список экземпляров с сервера, а их связанные свойства еще не реализованы, то уже слишком поздно. Кроме того, Include не будет работать в клиенте Silverlight. Таким образом, RIA Services имеет серверные инструменты, которые вы можете использовать, чтобы гарантировать, что вы сначала вернете правильный, полностью материализованный граф объектов.

Вместо этого вам необходимо использовать IncludeAttribute внутри вашего сервера служб RIA. Вы можете создать класс метаданных «приятель», чтобы украсить вашу модель сущности с помощью [Включить]. Есть примеры в the RIA Services overview document, section 4.8.

+0

Здравствуйте, я не знаю, есть ли у нас одна и та же версия, но ни одна из них не возможна, когда я кодирую ее. Нет доступного «.Include», только «Intersect» .. im, используя сущностные сущности, которые имеют «ObjectContext» в качестве базового класса. И когда я проецирую, в intellisense для меня нет свойств. – Jukeman

+1

Include - это метод ObjectQuery , а не IQueryable . Поэтому проверьте тип ссылки. Объекты не выводятся из ObjectContext, они происходят из EntityObject. В моем примере не будет IntelliSense для проецируемого объекта, потому что я использовал * анонимный * тип. Если бы я использовал неанонимный тип, то был бы IntelliSense. –

3

Вы можете использовать метод Include() для System.Data.Objects.ObjectQuery. Этот метод указывает связанные объекты для включения в результаты запроса, и вызовы Include() могут быть соединены вместе для загрузки нескольких связанных объектов.

Например, чтобы загрузить ModifiedByUser и категории вы бы использовать запрос следующим образом:

var q = from p in context.Products.Include("ModifiedByUser").Include("Category") 
     select p; 

Если Категория объект также был ModifiedByUser объект, который вы хотели загрузить вы бы использовать запрос, как это:

var q = from p in context.Products 
       .Include("ModifiedByUser") 
       .Include("Category.ModifiedByUser") 
     select p; 

См. Shaping Query Results на MSDN для получения дополнительных примеров.

+0

Я вижу это решение совсем немного, поэтому я должен делать что-то совершенно иное, чем все остальные. В основном, я использую контекст из базы данных, которая была сгенерирована с помощью entityframework. У меня последняя версия .Net. Нет «Include» availbale. Используете ли вы dbml/linq в этом примере?Im думает, что это почему-то ... – Jukeman

7

Использование .Include(), как и многие другие, предлагает отличный способ добиться того, что вам нужно.

Однако иногда вам может потребоваться «перезагрузить» что-то позже, если вы не включили «или», или что вам нужно только иногда, поэтому включение оператора Include может быть пустой тратой вычислительных циклов во многих случаях ,

В случае особых отношений, таких как «Product.Category» (где Product.Category является вашим навигационным свойством от продукта к категории), вы, скорее всего, также имеете элемент «Product.CategoryReference». Вы можете проверить, что, чтобы увидеть, если он загружен или нет, и если нет, то вы можете загрузить его «по требованию»:

if(!Product.CategoryReference.IsLoaded) 
{ 
    Product.CategoryReference.Load(); 
} 

Теперь ваша ссылка «Категория» должен быть в памяти и готовы к использованию.

Если у вас есть свойство навигации, которая ссылается на коллекцию вещей (например, «Части» для продукта), вы можете сделать то же самое, непосредственно на свойства навигации:

if(!Product.Parts.IsLoaded) 
{ 
    Product.Parts.Load(); 
} 

Это может быть полезную технику для «загрузки по требованию» свойств навигации для одного или коллекционного типа, если вы не включили их в свой запрос EF.

Марк

+0

Спасибо всем, я понял, что причина, по которой я не смог реализовать множество предлагаемых решений, заключается в том, что контекст отличается после преобразования службой домена для silverlight. В коде для модели данных структуры сущности я могу реализовать все ваши решения, и я только что нашел это. Но благодаря вашей помощи я знал, что проблема должна заключаться в том, что я искал не то место ... – Jukeman

0

Я заметил, что упомянутое выше решение Крейг не загружается как ModifiedByUser и Категорию. Он загружает только последний набор объектов, который в этом случае является «Категория».

var q = from p in Context.Products 
       .Include("ModifiedByUser") 
       .Include("Category") 
    select p; 

Однако, если поменять порядок, чтобы сделать его .Include("Category").Include("ModifiedByUser"), то ModifiedByUser загружается. Самое странное, что свойство IsLoaded обоих объектов будет отображать «true», однако граф для первого коллекций объектов всегда будет равен нулю. Не знаю, почему это так.

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