Платформа объекта 3.5 - Как загрузить дочерние элементы

Как другие заметили, необходимо или создать nullable столбец или обеспечить ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ. Если это не достаточно гибко (например, если Вам нужно новое значение, которое будет вычислено для каждой строки индивидуально так или иначе), можно использовать то, что в PostgreSQL, все команды DDL могут быть выполнены в транзакции:

BEGIN;
ALTER TABLE mytable ADD COLUMN mycolumn character varying(50);
UPDATE mytable SET mycolumn = timeofday();    -- Just a silly example
ALTER TABLE mytable ALTER COLUMN mycolumn SET NOT NULL;
COMMIT;
10
задан MPelletier 28 August 2010 в 02:30
поделиться

4 ответа

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

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
        }

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

Обновление

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

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

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

16
ответ дан 3 December 2019 в 16:10
поделиться

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

Например, для загрузки ModifiedByUser и Category вы должны использовать такой запрос:

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

Если у вашей сущности Category также была сущность ModifiedByUser, которую вы хотели загрузить, вы бы использовали такой запрос:

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

См. Shaping Query Results в MSDN для дальнейших примеров.

3
ответ дан 3 December 2019 в 16:10
поделиться

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

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

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

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

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

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

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

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

Marc

7
ответ дан 3 December 2019 в 16:10
поделиться

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

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

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

0
ответ дан 3 December 2019 в 16:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: