c# - 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>();
什么会导致这个问题?
解决方案
推荐阅读
- azure - Azure Active Directory API 获取列表
- javascript - JS 可聚焦 div 防止在 keyup 上滚动
- java - Spring Security OAuth2 - URLEncoded输入键值自动附加到令牌响应json中
- mysql - 将 MySQL 中的非空重复行从多行减少到一
- php - 从不同的表中减去 2 列
- javascript - 不应允许用户在任何字段中输入或复制/粘贴表情符号字符
- c# - 获取字符宽度
- php - OctoberCMS - 被覆盖的博客组件(Rainlab 博客)在同一页面中的多次使用
- c# - 如何检测我们在 .NET 中运行在 ARM64 版本的 Windows 10 下?
- python - GitPython:检查子模块远程更改