У меня есть проект 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
не пуст (а количество элементов равно количеству элементов на машине разработки), но отдельные элементы равны нулю.
Я использую одного и того же пользователя с одной и той же БД для обеих сред.
Это определение сущности UserTeam
. Это просто отображение «многие ко многим» между сущностью User
Boilerplate и моей сущностью Team
.
public class UserTeam : Entity<int>
{
public User User { get; set; }
public Team Team { get; set; }
}
Что Вы думаете об этом?
ОБНОВЛЕНИЕ 1:
Я выполнил непосредственно SQL-запрос, чтобы проверить, может ли это быть проблемой Boilerplate или чем-то еще. Это код, который я запускаю (тем же методом)
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
}
}
Что ж, данные получены, и у меня нет нулевых значений для данных пользователя. Кажется, что-то ломается между ASPNET Boilerplate, Entity Framework Core и механизмом SQL. У тебя есть какие-нибудь подсказки?
ОБНОВЛЕНИЕ 2:
Я думал о проблеме с разрешением на операцию чтения объекта 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
не получает пользователей с ненулевым значением, потому что по какой-то причине таблица User
недоступна для зарегистрированного пользователя (но это один и тот же пользователь для обеих сред!)
Что вы думаете?
проблема в том, что вы пытаетесь получить доступ к 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>>();
//...
}
Я нашел проблему. В производственной среде я входил в систему с пользователем admin
, но не выбирал ни одного арендатора, поэтому я входил в клиентскую среду .
, показанную как
Current tenant: Not selected
на странице входа.
Вход в систему с использованием клиента Default
(или любого рабочего клиента) устранил проблему.
Вот у меня есть такой список:
[null,null,null,null,...]
. Количество элементов на сервере IIS равно количеству элементов в среде разработки.