4

Рассмотрим следующие сущности модели:Явная загрузка нескольких ссылок/коллекций на сущности

public class Parent 
{ 
    public virtual FirstChild FirstChild { get; set; } 
    public virtual SecondChild SecondChild { get; set; } 
} 

В моем коде, я загрузил Parent объект:

Parent parent = <loaded in some way>; 

явно загружать свои навигационные свойства, я использую

db.Entry(parent).Reference(p => p.FirstChild).Load(); 
db.Entry(parent).Reference(p => p.SecondChild).Load(); 

Но это приводит к двум запросам БД.

Вопрос: существует ли более элегантный способ, позволяющий явно загружать более одного навигационного свойства в одном запросе?

Если у меня не было parent загружен, я бы жадной загрузки:

Parent parent = db.Parents 
    .Include(p => p.FirstChild) 
    .Include(p => p.SecondChild) 
    .FirstOrDefault(); 

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

+1

Как бы вы загрузили его одним запросом в SQL? Мне кажется, что вам придется снова загрузить родителя, чтобы связать навигационные свойства. Если вы в порядке с пакетной загрузкой, я думаю, вы можете использовать 'Future' из [EntityFramework.Extended] (https://github.com/loresoft/EntityFramework.Extended). – Default

+0

@RazvanDumitru, потому что этот вопрос связан с функцией «ленивой загрузки» Entity Framework – lxa

+0

@Default SQL - отдельный запрос в родительской таблице с двумя объединениями для обоих детей; предлагаемое 'Future()' приятно - хотя это все равно приведет к двум отдельным запросам, насколько я понял? – lxa

ответ

1

Единственный возможный способ (afaik) - перезагрузить родительское свойство. Предположив, что переменная parent прикрепляется к контексту:

var tmp = db.Parents 
    .Include(p => p.FirstChild) 
    .Include(p => p.SecondChild) 
    .FirstOrDefault(p => p.Equals(parent)); 

// tmp and parent are the same instance now! 
var isTrue = ReferenceEquals(tmp, parent); 

var child1 = parent.FirstChild; // is already loaded 
var child2 = parent.SecondChild; // is already loaded 

Это работает, потому что контекст обнаружит, что объект, который вы ищете загружается и прилагается уже и, следовательно, не создавать новую, а обновить старую (parent в этом случае).

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

  • Нет связанных вопросов^_^