如何结合使用“ AsNoTracking”方法在EF Core中加载实体和显式加载相关实体

珍南

我目前正在使用这种方法通过以下方式加载实体及其相关实体AsNoTracking

await DbContext.Clients
                .Include(x => x.AllowedGrantTypes)
                .Include(x => x.RedirectUris)
                .Include(x => x.PostLogoutRedirectUris)
                .Include(x => x.AllowedScopes)
                .Include(x => x.ClientSecrets)
                .Include(x => x.Claims)
                .Include(x => x.IdentityProviderRestrictions)
                .Include(x => x.AllowedCorsOrigins)
                .Include(x => x.Properties)
                .Where(x => x.Id == clientId)
                .AsNoTracking()
                .SingleOrDefaultAsync();

Github上的代码详细信息:链接

可以,但是在迁移到EF Core 3.0之后,此查询非常慢。

我发现可以通过显式地加载相关实体来解决此性能问题:

IQueryable<Entities.Client> baseQuery = Context.Clients
                .Where(x => x.Id == clientId)
                .Take(1);

            var client = await baseQuery.FirstOrDefaultAsync();
            if (client == null) return null;

            await baseQuery.Include(x => x.AllowedCorsOrigins).SelectMany(c => c.AllowedCorsOrigins).LoadAsync();
            await baseQuery.Include(x => x.AllowedGrantTypes).SelectMany(c => c.AllowedGrantTypes).LoadAsync();
            await baseQuery.Include(x => x.AllowedScopes).SelectMany(c => c.AllowedScopes).LoadAsync();
            await baseQuery.Include(x => x.Claims).SelectMany(c => c.Claims).LoadAsync();
            await baseQuery.Include(x => x.ClientSecrets).SelectMany(c => c.ClientSecrets).LoadAsync();
            await baseQuery.Include(x => x.IdentityProviderRestrictions).SelectMany(c => c.IdentityProviderRestrictions).LoadAsync();
            await baseQuery.Include(x => x.PostLogoutRedirectUris).SelectMany(c => c.PostLogoutRedirectUris).LoadAsync();
            await baseQuery.Include(x => x.Properties).SelectMany(c => c.Properties).LoadAsync();
            await baseQuery.Include(x => x.RedirectUris).SelectMany(c => c.RedirectUris).LoadAsync();

Github上的代码详细信息:链接

不幸的是,我尝试使用该AsNoTracking方法重写此示例,但是它不起作用-未加载相关实体。

如何使用AsNoTracking方法通过更快的性能重写原始查询?

我不需要针对我的用例跟踪客户端实体。

杰加西洛夫斯基

正如EF Core文档所说,v3现在会生成联接,并且该查询是笛卡尔爆炸问题 的受害者https://docs.microsoft.com/zh-cn/ef/core/querying/related-data

文档还指出,在以前的版本中,EF为每个包含项生成单独的查询。所以我认为好的解决方案是

var baseEntity = await DbContext.Clients.AsNoTracking().SingleOrDefaultAsync(x => x.Id == clientId);
baseEntity.AllowedGrantTypes = await DbContext.ClientCorsOrigins.AsNoTracking().Where(x => x.ClientId == clientID).ToListAsync();
baseEntity.RedirectUris = await DbContext.ClientRedirectUris.AsNoTracking().Where(x => x.ClientId == clientID).ToListAsync();
...
...

依此类推,直到获得所需的所有相关资源。它将模仿以前的行为。如果您确实需要使用导航属性,那么就不能使用它.AsNoTracking()如果我的想法看起来太幼稚-我只能想到的另一种方法是在使用导航属性后将实体从跟踪上下文中分离出来。

因此,从第二个链接实现代码后,您将需要遍历对象中的实体并将其标记为分离 DbContext.Entry(entity).State = EntityState.Detached;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Include加载相关数据实体ef Core 3.1

来自分类Dev

如何使用实体框架显式加载特定实体的特定相关实体?

来自分类Dev

如何结合使用Find()和AsNoTracking()?

来自分类Dev

在 EF6 中加载相关实体

来自分类Dev

使用AsNoTracking()的实体框架延迟加载

来自分类Dev

如何急于在EF Core中加载相关数据?

来自分类Dev

使用EntityFramework在存储库中加载相关实体

来自分类Dev

如何在EF中加载相关对象?

来自分类Dev

如何使用Entity Framework Core加载相关实体

来自分类Dev

如何快速加载相关实体

来自分类Dev

如何加载所有相关的EF实体以准备序列化

来自分类Dev

EF核心3.1:在使用紧急加载加载相关实体时,我应该初始化列表导航属性吗?

来自分类Dev

EF核心:加载相关实体-循环依赖

来自分类Dev

EF-相关实体未加载

来自分类Dev

使用EF Core 3.1加载相关数据

来自分类Dev

如何使用实体框架显式加载长导航属性链?

来自分类Dev

如何在Lightswitch中加载外部数据源的相关实体(Visual Studio 2013)

来自分类Dev

实体框架急于在EF4和EF6中加载差异

来自分类Dev

我可以在 CRUD 服务 GetAll 中使用 EF Core 2.0 'AsNoTracking' 吗?

来自分类Dev

如何为EF中的多个条目进行显式加载?

来自分类Dev

EF6渴望加载相关实体的单个属性

来自分类Dev

EF:加载相关实体惰性方式不起作用

来自分类Dev

使用EF Core 5.0加载自引用实体(只需在其导航属性中获取父级及其子级)

来自分类Dev

在新实体中加载导航属性的最佳方法

来自分类Dev

使用Moq,NUnit和实体框架重新加载保存的实体

来自分类Dev

使用Moq,NUnit和实体框架重新加载保存的实体

来自分类Dev

如何使用实体框架从数据库视图加载相关实体?

来自分类Dev

如何为实体框架已经跟踪的记录加载相关数据

来自分类Dev

如何手动以N:N关系加载相关实体?

Related 相关文章

  1. 1

    使用Include加载相关数据实体ef Core 3.1

  2. 2

    如何使用实体框架显式加载特定实体的特定相关实体?

  3. 3

    如何结合使用Find()和AsNoTracking()?

  4. 4

    在 EF6 中加载相关实体

  5. 5

    使用AsNoTracking()的实体框架延迟加载

  6. 6

    如何急于在EF Core中加载相关数据?

  7. 7

    使用EntityFramework在存储库中加载相关实体

  8. 8

    如何在EF中加载相关对象?

  9. 9

    如何使用Entity Framework Core加载相关实体

  10. 10

    如何快速加载相关实体

  11. 11

    如何加载所有相关的EF实体以准备序列化

  12. 12

    EF核心3.1:在使用紧急加载加载相关实体时,我应该初始化列表导航属性吗?

  13. 13

    EF核心:加载相关实体-循环依赖

  14. 14

    EF-相关实体未加载

  15. 15

    使用EF Core 3.1加载相关数据

  16. 16

    如何使用实体框架显式加载长导航属性链?

  17. 17

    如何在Lightswitch中加载外部数据源的相关实体(Visual Studio 2013)

  18. 18

    实体框架急于在EF4和EF6中加载差异

  19. 19

    我可以在 CRUD 服务 GetAll 中使用 EF Core 2.0 'AsNoTracking' 吗?

  20. 20

    如何为EF中的多个条目进行显式加载?

  21. 21

    EF6渴望加载相关实体的单个属性

  22. 22

    EF:加载相关实体惰性方式不起作用

  23. 23

    使用EF Core 5.0加载自引用实体(只需在其导航属性中获取父级及其子级)

  24. 24

    在新实体中加载导航属性的最佳方法

  25. 25

    使用Moq,NUnit和实体框架重新加载保存的实体

  26. 26

    使用Moq,NUnit和实体框架重新加载保存的实体

  27. 27

    如何使用实体框架从数据库视图加载相关实体?

  28. 28

    如何为实体框架已经跟踪的记录加载相关数据

  29. 29

    如何手动以N:N关系加载相关实体?

热门标签

归档