C# 存储库仅在某些情况下获取数据
我有一个ASPNET样板项目;下面的代码段是从服务和后台作业执行的C# 存储库仅在某些情况下获取数据,c#,asp.net-core,entity-framework-core,aspnetboilerplate,C#,Asp.net Core,Entity Framework Core,Aspnetboilerplate,我有一个ASPNET样板项目;下面的代码段是从服务和后台作业执行的 private readonly IRepository<UserTeam> _userTeamsRepository; [...] public List<UserTeam> GetUsers(){ var defaultUsers = _userTeamsRepository .GetAllIncluding(ut => ut.Te
private readonly IRepository<UserTeam> _userTeamsRepository;
[...]
public List<UserTeam> GetUsers(){
var defaultUsers = _userTeamsRepository
.GetAllIncluding(ut => ut.Team, ut => ut.User)
.Where(ut => ut.Team.AlwaysIncluded)
.ToList();
}
private readonly IRepository\u userTeamsRepository;
[...]
公共列表GetUsers(){
var defaultUsers=\u userTeamsRepository
.GetAllIncluding(ut=>ut.Team,ut=>ut.User)
.Where(ut=>ut.Team.Always包括在内)
.ToList();
}
它从用户
表和团队
表之间的联接表用户团队
中获取数据(一个用户
属于多个团队
,在一个团队
中可以有多个用户
)
正如我所说的,GetUsers()
方法在web服务和后台作业中都被引用。
使用断点,我可以看到当在web服务中调用该方法时,返回的列表中充满了UserTeam
实体,其中包含链接的Team
和User
实体(这是我想要的)
另一方面,当从后台作业调用时,仅填充团队
字段,而用户
部分为空
这是一个非常奇怪的问题,因为代码片段是相同的,唯一不同的是它在同一应用程序的不同上下文中被调用
您知道可能导致此问题的原因吗
谢谢根据,后台作业是跨租户的,因此无法访问用户
表信息
我通过在后台作业排队之前获取
用户
数据并将数据传递给作业的输入对象,解决了这个问题。您可以使用AbpSession
public class MyService
{
private readonly IAbpSession _session;
public MyService(IAbpSession session)
{
_session = session;
}
public void Test()
{
using (_session.Use(42, null))
{
var defaultUsers = _userTeamsRepository
.GetAllIncluding(ut => ut.Team, ut => ut.User)
.Where(ut => ut.Team.AlwaysIncluded)
.ToList();
}
}
}
你在用房客吗?或全局筛选器,每个请求发送值?从后台线程,您无法访问每个请求的信息(例如租户或其他与HttpContext相关的内容)。还要记住,DbContext是并且应该被解析为作用域服务,这意味着每个请求有一个实例。后台服务没有这个功能,通常是一个单例,使您的上下文也成为一个单例,您必须自己管理DbContext的生命周期(解析、操作、处置)Hi@Tseng。是的,我的应用程序是multitenant(我从基本模板开始,它是multitenant),尽管我只使用一个租户。总之,我无法获得用户信息,因为后台工作不是多租户的,对吗?更好的是,它们在所有租户中都是单身,因此无法设置正确的
User
来获取。现在我该怎么做才能解决这个问题?我会尽快尝试这个解决方案