C# 如果我将惰性加载设置为false(目前),那么如果我包含;虚拟的;关键词,还是忽略它?

C# 如果我将惰性加载设置为false(目前),那么如果我包含;虚拟的;关键词,还是忽略它?,c#,entity-framework,lazy-loading,virtual-functions,C#,Entity Framework,Lazy Loading,Virtual Functions,我的理解是,如果我想在EF6应用程序中使用延迟加载,我应该 用标记为虚拟的最后两项对我的关系进行如下编码: public class Test { public int TestId { get; set; } public int ExamId { get; set; } public string Title { get; set; } public int Status { get; set; } public System.DateTime Cre

我的理解是,如果我想在EF6应用程序中使用延迟加载,我应该 用标记为虚拟的最后两项对我的关系进行如下编码:

public class Test
{
    public int TestId { get; set; }
    public int ExamId { get; set; }
    public string Title { get; set; }
    public int Status { get; set; }
    public System.DateTime CreatedDate { get; set; }
    public virtual Exam Exam { get; set; }
    public virtual ICollection<UserTest> UserTests { get; set; }
}
公共类测试
{
公共int TestId{get;set;}
公共int ExamId{get;set;}
公共字符串标题{get;set;}
公共int状态{get;set;}
public System.DateTime CreatedDate{get;set;}
公共虚拟考试{get;set;}
公共虚拟ICollection用户测试{get;set;}
}
如果我不想使用延迟加载(目前),并且如果我将lazyloading配置设置为false,那么如果我保留virtual关键字,或者我应该这样编写没有关键字的类,那么是否有任何性能方面的考虑

public class Test
{
    public int TestId { get; set; }
    public int ExamId { get; set; }
    public string Title { get; set; }
    public int Status { get; set; }
    public System.DateTime CreatedDate { get; set; }
    public Exam Exam { get; set; }
    public ICollection<UserTest> UserTests { get; set; }
}
公共类测试
{
公共int TestId{get;set;}
公共int ExamId{get;set;}
公共字符串标题{get;set;}
公共int状态{get;set;}
public System.DateTime CreatedDate{get;set;}
公开考试{get;set;}
公共ICollection用户测试{get;set;}
}
我问这个问题的原因是,我希望通过保留
virtual
关键字来保持灵活性,但前提是当我不使用延迟加载时,这不会给我带来任何问题

我读了以下内容

如果在ICollection/one-to-many关系属性上使用virtual关键字,则默认情况下会延迟加载,而如果不使用virtual关键字,则会立即加载


即使我设置了
DbContext.Configuration.LazyLoadingEnabled=false,这也是真的吗

当您设置
LazyLoadingEnabled=False
时。即使包含virtual关键字,也不会影响延迟加载

virtual
DbContext.Configuration的两个属性一起工作:

  • ProxyCreationEnabled
[MSDN]获取或设置一个值,该值指示框架是否将 在需要时创建动态生成的代理类的实例 创建实体类型的实例

  • LazyLoadingEnabled

关键字
virtual
可以在运行时动态创建派生类,该派生类覆盖标记为
virtual
的属性,以便插入一些数据访问代码(“代理”)。但当您设置
LazyLoadingEnabled=false
时,您会告诉实体框架“不要用延迟加载代理覆盖我的实体类”。在这种情况下,
virtual
关键字没有任何效果。(实际上,我无法从.NET CLR的角度说明实例化具有
virtual
属性或方法的对象的成本。这可能会有一些成本,但我确信与实际访问数据库相比,这几乎是零成本。)

因此,我认为,您将属性标记为
virtual
以便在将来打开以进行可能的延迟加载的方法很好

顺便说一句:这是错误的,如果你不使用虚拟关键词,它将被加载。如果禁用延迟加载-通过省略
virtual
关键字或设置
lazyloadingable=false
-默认情况下不会获得快速加载。相反,您根本无法加载(导航属性)。必须通过使用
Include
或使用投影显式编码急加载


只需提一下:您还可以在以后需要时添加
virtual
修饰符。您可以将其限制为特定的实体。EF不认为这是一个模型改变,它会触碰数据库模式。

如果你设置它,那么就要进行紧急加载。虚拟关键字的意思不同,我想“如果你设置了它”是什么意思?如果你将lazyloadingenabled设置为false