我有一个ASPNET Boilerplate项目,该项目在一个应用程序服务中使用存储库访问数据库中的某些数据
public class AnAppService : AsyncCrudAppService<MyEntity, MyEntityDto, int, PagedAndSortedResultRequestDto, MyEntityDto, MyEntityDto>, IAnAppService
{
private readonly IRepository<UserTeam> _userTeamsRepository;
public AnAppService(IRepository<MyEntity> repository,
IRepository<UserTeam> userTeamsRepository)
: base(repository)
{
_userTeamsRepository = userTeamsRepository;
}
public override Task<MyEntityDto> Create(MyEntityDto input)
{
[...]
var myDbContext = _myDbContextProvider.GetDbContext();
var uteams = // Here the items have null User objects, though it was included in the query
myDbContext.UserTeams
.Include(ut => ut.User)
.Where(ut => ut.Team.Id == teamId)
.ToList();
[...]
}
}
}
在开发过程中,一切正常,并提取了链接的数据。
现在,我已将其部署在IIS 7服务器上,但现在无法正常工作了。调试时,我看到defaultUsers
列表不为空(项目数等于开发机器中的项目),但是单个项目为null。
对于两种环境,我都使用同一用户和同一数据库。
这是UserTeam
实体的定义。这只是Boilerplate的User
实体和我的{{1}}实体之间的多对多映射。
Team
您对此有何看法?
更新1:
我直接执行了SQL查询,只是检查它是否是Boilerplate的问题或其他问题。这是我运行的代码(使用相同的方法)
public class UserTeam : Entity<int>
{
public User User { get; set; }
public Team Team { get; set; }
}
好吧,数据已获取,并且我没有用户数据的空值。似乎在ASPNET Boilerplate,Entity Framework Core和SQL引擎之间发生了一些故障。你有什么线索吗?
更新2:
我在考虑string queryString = "SELECT u.name name FROM UserTeams ut join AbpUsers u on ut.UserId = u.Id";
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlCommand command = new SqlCommand(queryString, connection);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
var name = reader["name"]; // The name variable has a value
}
}
实体的读取操作的权限问题,因此我检查了这一点:
User
这里,我在public class AnAppService : AsyncCrudAppService<MyEntity, MyEntityDto, int, PagedAndSortedResultRequestDto, MyEntityDto, MyEntityDto>, IAnAppService
{
private readonly IRepository<User, long> _usersRepository;
public AnAppService(IRepository<MyEntity> repository,
IRepository<UserTeam> userTeamRepository)
: base(repository)
{
_userTeamRepository = userTeamRepository;
}
public override Task<MyEntityDto> Create(MyEntityDto input)
{
[...]
var users = _usersRepository.GetAll();
[...]
}
}
}
实体上使用一个简单的存储库来读取所有用户。好吧,虽然我可以在开发机器上获取所有用户,但在部署机器上仅返回User
用户。在这两种情况下,我都是使用admin
用户登录的。
我认为admin
存储库未获取非空用户,因为出于某种原因,登录用户无法访问UserTeam
表(但对于两个环境,它都是同一用户!)
你怎么看?
答案 0 :(得分:0)
问题是您试图以错误的方式访问DbContext。在旁边,您不应从DbContext检索用户列表。您必须使用已经注入的存储库。
public override Task<MyEntityDto> Create(MyEntityDto input)
{
//...
var uteams = _userTeamsRepository.GetAllIncluding(x=>x.User).Where(ut => ut.Team.Id == teamId).ToList();
//and you need to map uteams to your DTO list.
//var uteamsDto = uteams.MapTo<List<MyTeamDto>>();
//...
}
答案 1 :(得分:0)
我发现了问题。在生产环境中,我使用admin
用户登录,但未选择任何租户,因此我登录了.
租户,显示为
当前租户:未选中
在登录页面上。
使用Default
租户(或任何工作的租户)登录可以解决问题