Entity Framework 6: Включить не работает случайно - PullRequest
2 голосов
/ 31 января 2020

У меня следующий запрос:

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>();

Что может вызвать эту проблему?

...