Вместо непосредственного использования ConfigurationDbContext
в проекте IdentityServer есть удобный интерфейс, который является более абстрактным: IClientStore
.Этот интерфейс сам содержит одну функцию: FindClientByIdAsync
, которую можно использовать для получения Client
.Client
включает в себя ряд свойств, в том числе:
- ClientName
- LogoUri
- Свойства
Вы можете получить экземплярIClientStore
с использованием DI (я полагаю, вы уже делаете это для ConfigurationDbContext
).Если у вас есть это, просто позвоните FindClientByIdAsync
соответственно:
var yourClient = await clientStore.FindClientByIdAsync(clientId);
При использовании этого подхода будет заполнено Properties
, как и ожидалось.
, чтобы объяснить, почемуВаш оригинальный подход не дает ожидаемых результатов, нам нужно понять, как Entity Framework Core обрабатывает загрузку связанных данных .Проще говоря, при извлечении сущности Client
(это класс Client
, отличный от того, который я использовал выше), свойства навигации (например,Properties
) по умолчанию не заполнены, поэтому вы видите null
.Я настоятельно рекомендую вам прочитать документы Загрузка связанных данных , если вас больше интересует, как это работает.
Реализация Entity Framework Core IClientStore
(ClientStore
)) обрабатывает эту загрузку связанных данных для вас.Вот фрагмент кода из самого источника:
public Task<Client> FindClientByIdAsync(string clientId)
{
var client = _context.Clients
// ...
.Include(x => x.Properties)
.FirstOrDefault(x => x.ClientId == clientId);
var model = client?.ToModel();
return Task.FromResult(model);
}
Include(x => x.Properties)
- это то, что заботится о получении Properties
из базы данных.