Я использую EF Model сначала с объектами POCO и с пользовательскими DbContexts. Моя проблема в том, что настройка LazyLoadingEnabled=false
ничего не влияет, свойства навигации по-прежнему загружаются. Ниже мой пример упрощен.Настройка LazyLoadingEnabled не работает в EF 5
Сущность программы. Программа может быть частью других программ:
namespace Domain.Entities
{
using System;
using System.Collections.Generic;
public partial class Program
{
public Program()
{
this.Programs = new HashSet<Program>();
}
public int Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public System.DateTime StartDate { get; set; }
public System.DateTime EndDate { get; set; }
public Nullable<int> ProgramId { get; set; }
public virtual ICollection<Program> Programs { get; set; }
public virtual Program OwnerProgram { get; set; }
}
}
DbContext:
namespace Infrastructure.Model
{
public class ProgramContext : DbContext
{
public ProgramContext()
: base("name=MyContainer")
{
Configuration.LazyLoadingEnabled = false;
}
public DbSet<Program> Programs { get; set; }
}
}
Вот как я использую его:
private ProgramContext _dbContext = new ProgramContext();
// GET api/program
public IEnumerable<Program> GetPrograms()
{
List<Program> list = _dbContext.Programs.ToList();
return list;
}
С выше образца, EF еще загружает программы и свойства OwnerProgram для класса программы. Я попытался удалить виртуальные ключевые слова, отключив создание прокси, а также проверил, что LazyLoadingEnabled=false
на самой модели.
Я что-то упустил?
Спасибо, это то, что я вижу. Есть ли способ заставить EF не загружать свойства навигации, если я не использую .Include()? – gixen
@gixen: Как сказано, на самом деле это не «загрузка». Исправление отношений просто помещает сущности в коллекции навигации и ссылки, которые уже загружены в любом случае. Таким образом, накладные расходы отсутствуют. Если вы хотите изменить объекты после загрузки, вам потребуется отслеживание изменений, и вы не можете отключить это поведение. Без отслеживания изменений в ситуациях, доступных только для чтения, вы можете попробовать '_dbContext.Programs.AsNoTracking(). ToList()'. Но я не уверен, поможет ли это в этом случае. – Slauma
То, что я получаю от этого ответа, заключается в том, что нет способа загрузить весь объектный граф в EF без открытого контекста для ленивых свойств навигации загрузки. ИЛИ .Include («NavigationProtperyName») можно явно вызвать для загрузки свойств навигации, но это необходимо для каждого запроса. –