Навигационные свойства загружаются лениво, даже когда ObjectContext.ContextOptions.LazyLoadingEnabled = false - PullRequest
1 голос
/ 21 октября 2010

Я закомментировал строку кода, которая позволяет ленивую загрузку от всех перегрузок ctor для моего класса ObjectContext, но когда я перебираю навигационное свойство, итерация проходит успешно.Почему?

Вот соответствующие биты кода.

    public MyExpensesEntities() : 
                 base("name=MyExpensesEntities", "MyExpensesEntities")
    {
        // this.ContextOptions.LazyLoadingEnabled = true;
        OnContextCreated();
    }

    static void Main(string[] args)
    {
    AddExpenses();

       Console.WriteLine("Lazy loading is {0}.", 
                         _context.ContextOptions.LazyLoadingEnabled ? 
                         "enabled": "disabled");

       PrintCategorywiseExpenses();

   _context.Dispose();
       Console.WriteLine("Press any key to exit...");
   Console.ReadKey();
    }

 static void PrintCategorywiseExpenses()
    {
        foreach (var cateogry in _context.Categories)
        {
            Console.WriteLine
                            ("Category: {0}\n----------------", 
                             cateogry.CategoryName);

            foreach (var e in cateogry.Expenses)
                Console.WriteLine
                                    ("\tExpense: {0}\tAmount: {1}", 
                                     e.Particulars, e.Amount.ToString("C"));
        }

        Console.WriteLine();
    }

1 Ответ

4 голосов
/ 21 октября 2010

Вы должны знать, что, выполняя foreach над свойством навигации, вы явно просите EF загрузить его для вас, и только то, что вы отключаете отложенную загрузку, не означает, что вы не можете явно загрузить их позже. Так что, как только он отключен, вы все равно можете явно загружать связанные данные по требованию, если это необходимо, и это именно то, что происходит при использовании foreach. Другой термин для «Ленивая загрузка» на самом деле «неявная отложенная загрузка» , и это не помешает нам выполнить «Явная отложенная загрузка»

В основном эта строка кода:

foreach (var cateogry in _context.Categories)
почти эквивалентно этому:
_context.Categories.AsEnumerable()

Чтобы увидеть, как отключение отложенной загрузки влияет на ваш код, см. Пример ниже.
В этом примере я отключаю его и читаю одну из категорий , затем располагаю ObjectContext и выполняю foreach над Расходами :

Category category;
using (MyEntities context = new MyEntities()) {
    category = _context.Categories.First();
}

foreach (var e in cateogry.Expenses)
      Console.WriteLine("Expense:{0}", e.Amount.ToString("C"));
}


LazyLoading отключен :
Ничего не происходит, код никогда не попадет в foreach, так как cateogry.Expenses.Count == 0

LazyLoading включен :
EF пытается ленивые расходы на загрузку , и поскольку ObjectContext был удален (путем выхода из с использованием scope), вы получите System.ObjectDisposedException содержащий это сообщение:
The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.

...