У меня следующий запрос:
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>();
Что может вызвать эту проблему?