C# 即使ObjectContext.ContextOptions.LazyLoadingEnabled=false,导航属性也会延迟加载

C# 即使ObjectContext.ContextOptions.LazyLoadingEnabled=false,导航属性也会延迟加载,c#,entity-framework,entity-framework-4,lazy-loading,C#,Entity Framework,Entity Framework 4,Lazy Loading,我注释掉了允许从ObjectContext类的所有ctor重载延迟加载的代码行,但是当我迭代导航属性时,迭代是成功的。为什么? 下面是相关的代码位 public MyExpensesEntities() : base("name=MyExpensesEntities", "MyExpensesEntities") { // this.ContextOptions.LazyLoadingEnabled = true;

我注释掉了允许从ObjectContext类的所有ctor重载延迟加载的代码行,但是当我迭代导航属性时,迭代是成功的。为什么?

下面是相关的代码位

    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();
    }

您应该知道,通过对导航属性执行
foreach
操作,您可以显式地要求EF为您加载它,并且关闭延迟加载并不意味着您以后无法显式加载它们。因此,一旦它被禁用,您仍然可以根据需要显式地加载相关数据,这正是使用
foreach
时发生的情况。“延迟加载”的另一个术语实际上是“隐式延迟加载”,它不会阻止我们进行“显式延迟加载”

基本上,这一行代码:
foreach (var cateogry in _context.Categories)
这几乎相当于:

_context.Categories.AsEnumerable()
要了解禁用延迟加载对代码的影响,请参见下面的示例。
在本例中,我禁用它并读取其中一个类别,然后处置ObjectContext并执行foreach over Expenses:


懒散加载已禁用
没有发生任何事情,代码将永远不会进入foreach,因为
cateogray.Expenses.Count==0


懒散加载已启用
EF尝试延迟加载开销,由于ObjectContext已被释放(通过退出使用范围),您将得到一个包含以下消息的消息:

ObjectContext实例已被释放,不能再用于需要连接的操作。

您应该知道,通过对导航属性执行
foreach
操作,您可以显式请求EF为您加载它,并且仅仅因为您关闭了延迟加载并不意味着您不能显式地加载它稍后再加载。因此,一旦它被禁用,您仍然可以根据需要显式地加载相关数据,这正是使用
foreach
时发生的情况。“延迟加载”的另一个术语实际上是“隐式延迟加载”,它不会阻止我们进行“显式延迟加载”

基本上,这一行代码:
foreach (var cateogry in _context.Categories)
这几乎相当于:

_context.Categories.AsEnumerable()
要了解禁用延迟加载对代码的影响,请参见下面的示例。
在本例中,我禁用它并读取其中一个类别,然后处置ObjectContext并执行foreach over Expenses:


懒散加载已禁用
没有发生任何事情,代码将永远不会进入foreach,因为
cateogray.Expenses.Count==0


懒散加载已启用
EF尝试延迟加载开销,由于ObjectContext已被释放(通过退出使用范围),您将得到一个包含以下消息的消息:

ObjectContext实例已被释放,无法再用于需要连接的操作。

那么何时未加载导航属性?那么,将延迟加载设置为false如何影响导航属性的延迟加载呢?你能给我一个例子,其中延迟加载被关闭,导航属性无法访问吗?当然,我刚刚在我的答案中添加了一个代码片段来说明它,请检查它。非常感谢你的回答。我仍在再读一遍,并对它进行更深入的思考。我很快会在评论中有更多的问题。回答不错,尽管你发布了一行不可能的代码:var category;如果不给C#中的变量赋值,就不能使用“var”关键字,因为没有勺子。。。等待什么我的意思是,C#^^中没有非类型化变量,这只是因为我不知道Categories ObjectSet的实体对象的名称。让我们假设它是类别。我改变了密码。您是对的,对于匿名类型,您将在声明行初始化变量,否则编译器会抱怨。谢谢提醒:)那么什么时候导航属性没有加载?那么,将延迟加载设置为false如何影响导航属性的延迟加载呢?你能给我一个例子,其中延迟加载被关闭,导航属性无法访问吗?当然,我刚刚在我的答案中添加了一个代码片段来说明它,请检查它。非常感谢你的回答。我仍在再读一遍,并对它进行更深入的思考。我很快会在评论中有更多的问题。回答不错,尽管你发布了一行不可能的代码:var category;如果不给C#中的变量赋值,就不能使用“var”关键字,因为没有勺子。。。等待什么我的意思是,C#^^中没有非类型化变量,这只是因为我不知道Categories ObjectSet的实体对象的名称。让我们假设它是类别。我改变了密码。您是对的,对于匿名类型,您将在声明行初始化变量,否则编译器会抱怨。谢谢你的提醒:)