Ho un progetto ASPNET Boilerplate; la parte di codice qui sotto è eseguita sia da un servizio che da un lavoro in background
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();
}
Raccoglie i dati da una tabella di join UserTeam
tra la tabella Users
e una tabella Teams
(un User
appartiene a più Teams
, in una Team
possono esserci più Users
).
Come ho detto, il metodo GetUsers()
viene riferito sia in un servizio Web che in un processo in background. Usando un punto di interruzione, posso vedere che quando il metodo viene chiamato nel servizio Web, l'elenco restituito è pieno di entità UserTeam
che contengono sia le entità Team
collegate sia quelle User
(che è ciò che voglio).
D'altra parte, quando viene chiamato dal processo in background, viene compilato solo il campo Team
, mentre la parte User
è null.
È un problema molto strano perché la parte di codice è la stessa e l'unica cosa diversa è il fatto che è chiamata in diversi contesti della stessa applicazione.
Sai qualcosa che potrebbe causare questo problema?
Grazie
Come da commento Tseng , il lavoro in background è cross tenant in modo che non abbia accesso alle informazioni della tabella User
.
Ho risolto questo problema recuperando i dati User
prima di accodare il lavoro in background e passare i dati all'oggetto di input del lavoro.
È possibile impostare in modo esplicito il titolare corrente con 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();
}
}
}