实体框架:如何为特定查询禁用延迟加载?


88

有什么方法可以对Entity Framework 6上的特定查询禁用延迟加载吗?我想定期使用它,但有时我想禁用它。我正在使用虚拟属性来延迟加载它们。


20
设置context.Configuration.LazyLoadingEnabled = false; 您要运行的查询之前
Karthik Ganesan 2014年

5
您可以先设置该值this.Configuration.LazyLoadingEnabled = false;,然后再次设置它this.Configuration.LazyLoadingEnabled = true;?另外,您可以阅读以下内容:msdn.microsoft.com/en-us/data/jj574232.aspx
user1477388 2014年

1
谢谢@KarthikGanesan。它按预期工作。
Marco Alves 2014年

@KarthikGanesan您能把您的评论作为答案吗?它工作得非常好:)
Sampath

1
添加了评论作为答案@Sampath
Karthik Ganesan

Answers:



40

您可以为特定查询禁用延迟加载,如下所示:

public static Cursos GetDatosCursoById(int cursoId)
{
    using (var bd = new AcademyEntities())
    {
        try
        {
            bd.Configuration.ProxyCreationEnabled = false;
            return bd.Cursos.FirstOrDefault(c => c.cursoId == cursoId);
        }
        catch (Exception ex)
        {
            return null;
        }
    }
}

20

我可能在这里丢失了一些内容,但是不是每次都更改配置,另一种方法可能是.Include()仅用于那些您希望加载的查询吗?

假设我们有一个Product具有导航属性的一类Colour类,您可能加载Colour了一个Product这样的-

var product = _context.Products
    .Where(p => p.Name == "Thingy")
        .Include(x => x.Colours)
        .ToList();

1
对我来说,这是最好的答案!
伊恩(Ian)

如果您只想加载“产品”(不包含任何内容),则此方法不完善。
Mackan '18

因此,您想获得不带任何相关对象的“产品”,还是不带任何相关对象的“产品”?
Parrybird

1
更多有用的答案。这控制了在构造查询时加载的特定从属表。对于任何现实世界的问题,这都必须走的路。
理查德·佩瑟南

5
它以另一种方式很有用……如果您采用这种方式,则仍然可以从“产品”中为另一个集合进行延迟加载。实际上,禁用延迟加载更为有效,以确保提前获取所需的所有数据,并避免造成隐藏的性能瓶颈。
道格

15

转到图表属性,找到一个指定用于延迟加载的属性并将其禁用。

如果您首先使用代码,则转到配置区域并使用以下命令从此处禁用它:

this.Configuration.LazyLoadingEnabled = false;

6
很多人都在问这个问题,我想说的是,人们不必看执行计划就不会写查询。始终知道您的代码发送到数据库的内容,否则您将遇到性能问题。您可以使用linq pad或其他工具查看实际查询并进行检查。
胡安


3

另一个EF版本的另一个方法(实体框架5)

//Note: ContextOptions instead of ChangeTracker or Configuration
context.ContextOptions.LazyLoadingEnabled = false; 

context是时ObjectContext,其包装器或多或少不推荐使用的前身DbContext
Gert Arnold

2

假设您有:

IOrderedQueryable<Private.Database.DailyItem> items;
using (var context = new Private.Database.PrivateDb())
{
    context.Configuration.LazyLoadingEnabled = false;
    items = context.DailyItem.OrderBy(c => c.sortOrder).OrderByDescending(c => c.isFavorite);
}

尽管显式设置为not,但仍然会延迟加载。修复很容易,将其更改为:

List<Private.Database.DailyItem> items;
using (var context = new Private.Database.PrivateDb())
{
    // context.Configuration.LazyLoadingEnabled = false;
    items = context.DailyItem.OrderBy(c => c.sortOrder).OrderByDescending(c => c.isFavorite).ToList();
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.