Entity Framework Eager Load не возвращает данные, ленивая загрузка делает
Я использую первый код EF5, и у меня есть объект, у которого есть коллекция, определенная как virtual
(lazy loaded). Это возвращает данные при вызове. Однако я хочу, чтобы он был загружен. Я удалил virtual
из сигнатуры свойства, но теперь он всегда возвращает данные null
. EF даже не запускает запрос, может ли кто-нибудь помочь?
Изменить: я знаю о .include()
Я бы предпочел использовать метод не виртуальной собственности для этого.
Объекты
User
([Key]
Id находится в объекте Resource, который является родителем класса person):
namespace Entities
{
[Table("Users")]
public class User : Person
{
[Required]
public ICollection<Role> Roles { get; set; }
}
}
Роль:
namespace Entities
{
public class Role
{
[Key]
public string Id { get; set; }
public virtual ICollection<User> Users { get; set; }
}
}
Ответы
Ответ 1
Это обычная путаница. Противоположностью ленивой загрузки является: без загрузки, если вы явно не выполняете загрузку самостоятельно (например, с помощью загрузки с помощью Include
).
Итак, если вы отключите ленивую загрузку любым способом - одним из них является удаление модификатора virtual
- поведение не превращается в загрузку, но без загрузки.
Подумайте об этом, предположите, что EF охотно загрузит все, что не помечено для ленивой загрузки. Вы рискуете загрузить половину базы данных, выполнив один простой запрос!
Существует no way, чтобы сделать свойство навигации загруженным по умолчанию (если вы все еще хотите, чтобы после прочтения выше).
Ответ 2
Вам нужно будет использовать метод include, чтобы принудительно загружать ICollections внутри ваших объектов с активной загрузкой. Дополнительная ссылка может помочь вам: http://msdn.microsoft.com/en-us/data/jj574232.aspx
Ответ 3
Здесь упоминается только одна вещь.
Если я отключу EF LazyLoading с помощью
this.DbContext.Configuration.LazyLoadingEnabled = false;
тогда метод "include" не будет загружать дочерние объекты для загрузки Eagerly.
поэтому, если я хочу использовать "include" в запросе, мне нужно включить свойство EF LazyLoading в одно и то же время.