2016-10-19 10 views
11

Поклонившись моей визуальной просьбе студии, я начал свой последний проект с использованием Entity Framework ядро ​​(1.0.1)Entity Framework Ядро - Ленивый Загрузка

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

Родитель Модель

public class Events 
{ 
    [Key] 

    public int EventID { get; set; } 
    public string EventName { get; set; } 
    public virtual List<EventInclusions> EventInclusions { get; set; } 
} 

Child Model

public class EventInclusions 
{ 
    [Key] 
    public int EventIncSubID { get; set; } 
    public string InclusionName { get; set; } 
    public string InclusionDesc { get; set; } 
    public Boolean InclusionActive { get; set; } 

} 

Добавление новых записей в этих таблицах, кажется, работает, как я привык, где я могу гнездо EventInclusions записей в виде списка внутри записи событий.

Хотя, когда я запрашиваю эту таблицу

_context.Events.Where(e => e.EventName == "Test") 

Этот вопрос

EventInclusions возвращает нулевое значение, независимо от данных за кулисами.

После прочтения немного я получаю ощущение, что это изменение между EF6, которые я обычно использую и EF Ядро

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

Caz

+0

Включили ли вы ленивую загрузку в контексте? – Gusman

+0

Эй, Гусман, мне никогда не приходилось в EF6 - я предполагаю, что это может быть в проблеме, потому что у меня нет ничего, что связано с Lazy Loading в моем контексте – Caz1224

+0

Если они сохранили тот же механизм (я до сих пор не использовал EF с ядром), то вы должны установить 'Configuration.LazyLoadingEnabled = true;' и 'Configuration.ProxyCreationEnabled = true;' в конструкторе контекста. – Gusman

ответ

17

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

На данный момент, если кто-то еще сталкивается с этой проблемой и борется. Ниже приведена демонстрация использования Искренняя загрузка, и это то, что вам нужно использовать.

Скажите, прежде чем у вас был объект человека, и этот объект содержал Список шляпок в другой таблице.

Вместо того, чтобы писать

var person = _context.Person.Where(p=> p.id == id).ToList(); 

person.Hats.Where(h=> h.id == hat).ToList(); 

Вам нужно написать

var person = _context.Person.Include(p=> p.Hats).Where(p=> p.id == id).ToList(); 

И тогда person.Hats.Where(h=> h.id == hat).ToList(); будет работать

Если у вас есть несколько списков - ЦЕПЬ Включает

var person = _context.Person.Include(p=> p.Hats).Include(p=> p.Tickets) 
          .Include(p=> p.Smiles).Where(p=> p.id == id).ToList(); 

Я получаю, почему этот метод безопаснее, что вы не загружаете огромные наборы данных, которые могут замедлить работу. Но я надеюсь, что они скоро начнут загружать Lazy !!!

Caz

+4

Вы хоть представляете, как реализовать шаблон репозитория, когда мне нужно загружать свойства навигации? это совсем не легко, когда у вас есть неизвестное количество функций 'include', которые вам нужны ... любые идеи? –

+1

@MohammedNoureldin Я столкнулся с той же проблемой. В конце концов я «решил» его просто разоблачить IQueryable. например Теперь у меня есть вещи, подобные методу IQueryable GetByIdQueryable (string id) в моем репозитории. Затем вызывающие могут делать _repo.GetByIdQueryable (id) .Include (b => b.RelatedEntityProperty) .SingleOrDefault(); Он работает и даже нормально с модульным тестированием, но для меня это немного запах, который вы должны разоблачить. Другой альтернативой было бы передать имена строк свойств, которые вы хотите включить, но это просто запрос на проблему imo. – Steve

4

LazyLoading пока не поддерживается EF Ядра, но есть неофициальная библиотека, которая позволяет LazyLoading: https://github.com/darxis/EntityFramework.LazyLoading. Вы можете использовать его, пока он официально не поддерживается. Он поддерживает EF Core v1.1.1. Он доступен как пакет nuget: https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.LazyLoading/

Отказ от ответственности: Я являюсь владельцем этого репо и приглашаю вас попробовать его, сообщить о проблемах и/или внести свой вклад.

+1

Пожалуйста, сделайте что-нибудь для поддержки EF core 2.0 –

1

Ленивая нагрузка планируется в ядре EF 2.1 - вы можете узнать больше о том, почему это обязательная функция - here.

+0

Ссылка сломана, а при ее исправлении требуется авторизация. Есть ли общедоступный источник? –

+0

Ссылка исправлена: D Thanx для дайте мне знать. Как только ленивый груз попадет на EF7, он будет полезен ... ожидая этого почти год ... – baHI

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