Ленивая загрузка недопустимое поведение при использовании tolist() или load()
Я учусь эф. Во время практики я заметил странное поведение при ленивой загрузке.
Я читал, что ленивая загрузка включена по умолчанию и может работать только в том случае, если свойства навигации помечены как виртуальные вместе с LazyLoadingEnabled = ture в конфигурации контекста.
Поэтому я решил отключить ленивую загрузку, установив переключатель в положение off, то есть LazyLoadingEnabled = false.
Вот код, который пытался получить доступ к dbset после этого:
if (context == null) context = new InventoryEntities("."); context.Configuration.LazyLoadingEnabled = false; List<STOCK_ITEM_GROUPS> res = (from groups in context.STOCK_ITEM_GROUPS orderby groups.name select groups).ToList<STOCK_ITEM_GROUPS>(); string msg = ""; foreach (var groups in res) msg += "Name: " + groups.name + "\tParent Name: " + (groups.STOCK_ITEM_GROUPS2 == null ? "none" : groups.STOCK_ITEM_GROUPS2.name) + Environment.NewLine; Console.WriteLine(msg);
Ниже приведен dbset, сгенерированный для STOCK_ITEM_GROUPS:
public partial class STOCK_ITEM_GROUPS { [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] public STOCK_ITEM_GROUPS() { this.STOCK_ITEM_GROUPS1 = new HashSet<STOCK_ITEM_GROUPS>(); this.STOCK_ITEM_MASTER = new HashSet<STOCK_ITEM_MASTER>(); } public short id { get; set; } public string name { get; set; } public Nullable<short> idParent { get; set; } public bool itemAddable { get; set; } public bool isactive { get; set; } public System.DateTime active_timestamp { get; set; } public Nullable<System.DateTime> deactivation_timestamp { get; set; } public byte[] rv { get; set; } [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] public virtual ICollection<STOCK_ITEM_GROUPS> STOCK_ITEM_GROUPS1 { get; set; } public virtual STOCK_ITEM_GROUPS STOCK_ITEM_GROUPS2 { get; set; } [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] public virtual ICollection<STOCK_ITEM_MASTER> STOCK_ITEM_MASTER { get; set; } }
Теперь, в идеале, я не должен получать данные для навигационного свойства
public virtual STOCK_ITEM_GROUPS STOCK_ITEM_GROUPS2 { get; set; }, так как ленивая загрузка не включена. Но я получаю соответствующие данные!
Я также попытался отключить ленивую загрузку в конструкторе контекста, но безрезультатно.
Возможно, я упускаю какую-то концептуальную вещь или есть что-то еще, чего я действительно не знаю.
Глядя на отладчик для генерируемых запросов, я нахожу только один запрос, который ищет все данные из базы данных.
таким образом, существует не только несколько запросов, но и связанные с ними данные. Я не понимаю, где я ошибаюсь.
Что я уже пробовал:
Я попробовал то же самое с методом Load() на DbSet, он также возвращает тот же результат, что и toList ().
Поискал в google, но нашел только 1 комментарий, который на самом деле не является тем состоянием, в котором я нахожусь, вот ссылка для этого:
c# - Entity Framework - ленивая загрузка, работающая даже с ToList() - переполнение стека[^]