Ограничение отложенной загрузки при автоматическом типе объекта EF - PullRequest
2 голосов
/ 06 декабря 2011

Folks, Я сопоставляю объекты EF простым Pocos, используя automapper в моем слое обслуживания. У меня есть некоторые сущности, которые имеют много отношений в EF, но я хочу ограничить, сколько из этого извлекается из БД. Одна из этих сущностей будет отображаться в таблицу базы данных, но будет иметь много связей с другими таблицами, которые будут отображаться как коллекции сущностей в сгенерированной модели (EDMX).

Таким образом, я создал «мелкое» poco для сущности, которое имеет свойства poco только для первого уровня свойств в сущности, то есть некоторые целочисленные идентификаторы вместо связанных коллекций / коллекций сущностей. Я сопоставляю следующим образом ....

var simplepocoforentity= Mapper.Map(_readOnlyDb.Single<EfEntity>(x => x.Id== Id),
                                    new SimplPocoForEntity());

Мой вопрос заключается в том, что, поскольку я здесь отображаю сущность только в простое poco, могу ли я быть уверен, что EF не будет пытаться запрашивать другие не связанные данные из отношений базовых таблиц БД, когда я выполняю сопоставление?

Я знаю, что могу исследовать это с помощью профилирования SQL, но я был бы признателен за любые входные данные для перехода по этому маршруту. Спасибо K.

1 Ответ

2 голосов
/ 06 декабря 2011

Это зависит от внутренней реализации AutoMapper. Я бы предположил, что AutoMapper не пытается получить доступ к свойствам навигации объекта (в этом случае запускается отложенная загрузка и дополнительный запрос к базе данных). Я не вижу причины, почему AutoMapper должен делать это, если вы отображаете только скалярные свойства. Но кто знает ...

Если вы хотите быть в безопасности, вы можете временно отключить отложенную загрузку:

try
{
    _readOnlyDb.ContextOptions.LazyLoadingEnabled = false;

    var simplepocoforentity = Mapper.Map(_readOnlyDb.Entities
        .Single(x => x.Id == Id), new SimplPocoForEntity());

    // ...
}
finally
{
    _readOnlyDb.ContextOptions.LazyLoadingEnabled = true;
}

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

var simplepocoforentity = _readOnlyDb.Entities
    .Where(e => e.Id == Id)
    .Select(e => new SimplPocoForEntity
    {
        PocoProperty1 = e.EntityProperty1,
        PocoProperty2 = e.EntityProperty2,
        PocoProperty3 = e.EntityProperty3
        // etc.
    })
    .Single();

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...