Как уже упоминалось в комментариях, я довольно уверенно (хотя мое использование EF Ядра ограничена), что это не может быть сделано автоматически с помощью стандартного отображения навигационных свойств. Кроме того, использование .Load
менее эффективно (и намного дольше), чем при использовании .Include
, поскольку вы будете запускать несколько запросов так же, как и само по себе ленивое навигационное свойство.
Есть два способа, которые я могу придумать, чтобы подойти к проблеме не желая делать проверки каждый раз в соответствии с вашим вопросом. Первый будет работать для загрузки вашего объекта Blog
, а второй - для повторного использования между другими, но все еще требует изменений в вашей загрузке.
1; Метод расширения для загрузки всех связанных сущностей, что-то вроде этого:
public static IQueryable<Blog> EagerWhere(this DbSet<Blogs> dbset, Expression<Func<Blog, bool>> expr) {
return dbset
.Include(m => m.Posts)
.Include(m => m.Author)
.Where(expr);
}
// .. usage
db.Blogs.EagerWhere(m => m.Id == 1);
(Обратите внимание, что я написал это как EagerWhere
, так что вы имеете больше контроля над запросом, так что это более многоразовые, а не простой Find
замены)
2; Напишите пользовательский атрибут и напишите метод, аналогичный описанному выше, который выполняет то же действие, что и .Find(..)
, но использует Reflection для поиска свойств с вашим настраиваемым атрибутом и рекурсивно передает их в .Include(..)
.
Я не буду писать пример для этого, так как я не уверен, что это стоит усилий из-за (обычно) ограниченного количества созданных объектов.
Does '.Include (..)' не работает в ядре? то есть. 'db.Blogs.Include (m => m.Posts) .Include (m => m.Author) .Find (1);' –
Да, но я пытаюсь обойти явное указание объектов, которые я хочу. https://docs.microsoft.com/en-us/ef/core/querying/related-data – wonea
А, извините, поэтому ваш вопрос заключается в том, как загрузить все навигационные реквизиты с этой модели. Я неправильно понял название и попытался просто упростить его. Я мог бы думать о простом способе сделать это с Reflection, но не уверен, что есть встроенный метод даже для старого EF. EDIT: Даже вопрос, с которым вы связались, будет работать для Core, поскольку вы все еще указываете, что загрузить. EDIT2: Я мог ошибаться, но я думаю, что '.Include (..)' быстрее, чем загрузка по отдельности, так как они станут частью первоначального запуска запроса. –