首页 > 解决方案 > 在尝试将 lambda 表达式传递到 Where 子句后,得到“尝试延迟加载分离实体上的导航属性”

问题描述

我正在使用启用延迟加载的 Entity Framework Core 2.1.2 并正在执行查询。如果我尝试传递 lambda 表达式,我总是会得到以下异常:

System.InvalidOperationException:为警告“Microsoft.EntityFrameworkCore.Infrastructure.DetachedLazyLoadingWarning”生成错误:尝试在“ParentProxy”类型的分离实体上延迟加载导航属性“Children”。分离实体或使用“AsNoTracking()”加载的实体不支持延迟加载。

这里有一些代码:

public class User
    {
        public virtual ICollection<UserRole> UserRoles { get; set; } = new HashSet<UserRole>();
    }

public class UserRole
    {
        public int UserId { get; set; }

        public int RoleId { get; set; }

        public virtual User User { get; set; }
    }

我的数据库上下文:

 public IServiceProvider ConfigureServices(IServiceCollection services)
    {
                services.AddDbContext<Context>(options =>
                {
                    options.UseLazyLoadingProxies();
                    options.UseSqlServer(Configuration.GetConnectionString("connection"));
                });
    }

这就是它的工作原理:

_userRepository.Table.Where(user => user.UserRoles.Any(userRole => userRole.RoleId == 10)).ToList()

这就是它不这样做的原因:

_userRepository.Table.Where(user => condition(user)).ToList()

条件是:

Func<User, bool> condition

例子:

Func<User, bool> result = (user) => user.UserRoles.Any(role => role.RoleId == 10) 

我很抱歉格式不好。但我希望你能理解我的问题。

标签: ef-core-2.1

解决方案


推荐阅读