存储库仅在本地开发环境中获取数据

时间:2018-08-10 11:44:58

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

我有一个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表(但对于两个环境,它都是同一用户!) 你怎么看?

2 个答案:

答案 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>>();
            //...
        }

请参见mappinghow to use repositories

答案 1 :(得分:0)

我发现了问题。在生产环境中,我使用admin用户登录,但未选择任何租户,因此我登录了.租户,显示为

  

当前租户:未选中

在登录页面上。 使用Default租户(或任何工作的租户)登录可以解决问题