首页 > 解决方案 > Entity Framework 6:Include 不能随机工作

问题描述

我有以下查询:

public User GetByEmail(string email, bool includeRoles = true, bool enableLazyLoading = false, bool includeDeleted = true)
{
    IQueryable<User> dbQuery = null;
    Context.Configuration.LazyLoadingEnabled = enableLazyLoading;

    if (includeRoles)
    {
       dbQuery = Content.Include(x => x.Roles).Include(x => x.Regions).Where(x => x.Email == email);
    }
    else
    {
       dbQuery = Content.Where(x => x.Email == email);
    }

    if (!includeDeleted)
    {
       dbQuery = dbQuery.Where(x => !x.IsDeleted);
    }

    return dbQuery.FirstOrDefault();
}

它从 Quartz 作业中定期调用,默认参数如下:

var user = _userRepository.GetByEmail(email);

因此包括角色,不包括已删除的用户并且没有延迟加载。而且大多数时候它工作正常:用户角色和区域集合都已加载。但有时随机(应该有一些原因,但我没有找到它)用户返回空集合(非空)。相同的用户,相同的查询,数据库中的相同数据,但结果不同。

我发现了几篇关于包含问题的文章(像这样),但它似乎与我无关,因为我在这里不使用投影或分组。

角色和区域集合被标记virtual并具有ICollection<T>类型:

 public virtual ICollection<Role> Roles { get; set; }

内容只是集合的简写:

 public DbSet<T> Content
 {
    get { return Context.Set<T>(); }
 }

DbContext 注册为每个请求或每个线程的实例。在 Quartz 作业执行的情况下,它应该是每个线程(Ninject):

kernel.Bind<DbContext>().To<PhotoContext>()
        .InScope(context => HttpContext.Current ?? StandardScopeCallbacks.Thread(context));

我们有很多这样注册的工作:

private static void ScheduleJob<T>(int hour, int minute, ScheduleType type, string jobName = null, string groupName = REPORT_GROUP_DEFAULT, DayOfWeek? dayOfWeek = null, int dayOfMonth = 1, bool test = false)
{
    Type jobType = typeof(T);
    jobName = jobName ?? $"{type}{jobType.Name}";

    IJobDetail existingJob = _Scheduler.GetJobDetail(new JobKey(jobName, groupName));

    if (existingJob != null)
        _Scheduler.DeleteJob(existingJob.Key);

    JobDetailImpl jobDefinition = new JobDetailImpl(jobName, groupName, jobType);

    ITrigger trigger = CreateTrigger(jobName, jobDefinition, groupName, hour, minute, type, dayOfWeek, dayOfMonth, test);

    _Scheduler.ScheduleJob(jobDefinition, trigger);
}

public static void Init()
{
    _Scheduler = DependencyResolver.Current.GetService<IScheduler>();
    ScheduleJob<UserLastActivityUpdateJob>(1, 0, ScheduleType.Hourly);
    //schedule other jobs
    _Scheduler.Start();
}

从 DependencyResolver 中检索内部作业依赖项:

_userRepository = DependencyResolver.Current.GetService<IUserRepository>();

什么会导致这个问题?

标签: c#.netentity-frameworkentity-framework-6eager-loading

解决方案


推荐阅读