存储库仅在某些情况下会提取数据

时间:2018-07-24 07:43:19

标签: c# asp.net-core entity-framework-core aspnetboilerplate

我有一个ASPNET Boilerplate项目;下面的代码是从服务和后台作业中执行的

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

它从UserTeam表和Users表之间的联接表Teams中获取数据(其中一个User属于多个Teams Team可以有多个Users)。

正如我所说,GetUsers()方法在Web服务和后台作业中都被引用。 使用断点,我可以看到,在Web服务中调用该方法时,返回的列表充满了UserTeam个实体,其中包含链接的TeamUser实体(这就是我想要的) )。

另一方面,从后台作业中调用它时,仅填充Team字段,而User部分为空。

这是一个非常奇怪的问题,因为代码段是相同的,唯一不同的是在同一应用程序的不同上下文中调用了它。

您知道什么可能导致此问题吗?

谢谢

2 个答案:

答案 0 :(得分:1)

您可以使用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();
        }
    }
}

答案 1 :(得分:0)

根据Tseng comment,后台作业是跨租户,因此它无权访问User表信息。

我通过在将后台作业排队之前获取User数据并将数据传递到作业的输入对象来解决此问题。

相关问题