Получение данных из репозитория только в локальной среде разработки

У меня есть проект 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 недоступна для зарегистрированного пользователя (но это один и тот же пользователь для обеих сред!) Что вы думаете?

Вот у меня есть такой список: [null,null,null,null,...]. Количество элементов на сервере IIS равно количеству элементов в среде разработки.

gvdm 10.08.2018 14:25
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
121
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

проблема в том, что вы пытаетесь получить доступ к 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 (или любого рабочего клиента) устранил проблему.

Другие вопросы по теме