AddConfigurationStore с использованием Oracle.EntityFrameworCore (2.18.0-beta3) OracleException: ORA-00942: таблица или представление не существует - PullRequest
0 голосов
/ 24 мая 2019

Я использую EntityFramework Core для конфигурации и рабочих данных, используя Oracle.EntityFrameworkCore(2.18.0-beta3), но получаю "OracleException: ORA-00942: table or view does not exist".

Oracle.EntityFrameworkCore(2.18.0-beta3) работает, поскольку я могу использовать «Контроллер MVC с представлениями, используя Entity Framework» для создания нового контроллера, который будет создавать и редактировать таблицы Oracle (были созданы контроллеры Clients и IdentityResources).

Startup.cs ConfigureServices содержит следующую конфигурацию:

var builder = services.AddIdentityServer(options =>
        {
            options.Events.RaiseErrorEvents = true;
            options.Events.RaiseInformationEvents = true;
            options.Events.RaiseFailureEvents = true;
            options.Events.RaiseSuccessEvents = true;
        })
              // this adds the config data from DB (clients, resources)
              .AddConfigurationStore(options =>
              {
                  options.ConfigureDbContext = b =>
                      b.UseOracle(connectionString);

              })
              .AddOperationalStore(options =>
              {
                  options.ConfigureDbContext = b =>
                      b.UseOracle(connectionString);
                  options.EnableTokenCleanup = true;
              });

Отображается страница Welcome to IdentityServer4 (версия 2.4.0.0), которая будет перенаправлять на параметры контроллера, но «обнаружить документ», (http://localhost:5000/.well-known/openid-configuration), возвращает "OracleException: ORA-00942: table or view does not exist".

1 Ответ

0 голосов
/ 01 июля 2019

Получил это для работы с Oracle.EntityFrameworkCore (2.19.0-бета4). Пара вещей, которые я узнал по пути:

1) Многие экземпляры Oracle придерживаются стандарта SQL-92, который ограничивает объекты (включая имена таблиц и столбцов) до 30 символов; несколько имен по умолчанию IdentityServer4 Имена столбцов таблицы «Клиент» превышают 30 символов. Миграция EF была изменена для адаптации ограничения на количество символов в имени столбца.

b.Property<bool>("AlwaysIncludeUserClaimsInIdToken")
        .HasColumnName("AlwaysIncludeUserClaimsInIdTok");

2) Oracle обрабатывает инкрементные первичные ключи иначе, чем SQLServer. Свойство EF миграции Oracle:ValueGenerationStrategy используется для всех первичных ключей.

b.Property<int>("Id")
        .ValueGeneratedOnAdd()
        .HasAnnotation("Oracle:ValueGenerationStrategy", OracleValueGenerationStrategy.IdentityColumn);

3) Имена таблиц Oracle не чувствительны к регистру, если они созданы в верхнем регистре; если они созданы в смешанном регистре, они чувствительны к регистру. Мне удалось заставить IdentityServer4 работать с Oracle, используя имена таблиц по умолчанию IdentityServer4. Однако я решил изменить имена таблиц на все прописные, изменив свойства EF на прописные:

migrationBuilder.CreateTable(name: "IS4_CLIENT",

b.ToTable("IS4_CLIENT"), 

principalTable: "IS4_CLIENT",

Свойства хранилища конфигурации IdentityServer4 необходимо изменить, чтобы они соответствовали измененным именам таблиц в верхнем регистре. Ниже приведен класс расширения, который использовался для настройки IdentityServer4 AddConfigurationStore и AddOperationalStore.

.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Reflection;
using Microsoft.Extensions.DependencyInjection;
using Oracle.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using IdentityServer4.EntityFramework.Entities;

namespace is4ef.Extensions
{
    public static class Is4BuilderExtensions
    {
        public static string IdentityResource { get; private set; }

        public static IIdentityServerBuilder AddIs4ConfigurationStore(
            this IIdentityServerBuilder builder, string connectionString)
        {

            string assemblyNamespace = typeof(Is4BuilderExtensions)
                .GetTypeInfo()
                .Assembly
                .GetName()
                .Name;

            builder
                .AddConfigurationStore(options => {
                    options.ConfigureDbContext = b =>
                        b.UseOracle(connectionString, optionsBuilder =>
                            optionsBuilder.MigrationsAssembly(assemblyNamespace)
                                .UseOracleSQLCompatibility("12"));
                    options.DefaultSchema = "X13663";
                    options.ApiClaim.Name = "IS4_AIPCLAIM";
                    options.ApiResourceProperty.Name = "IS4_APIPROPERTY";
                    options.ApiResource.Name = "IS4_APIRESOURCE";
                    options.ApiScopeClaim.Name = "IS4_APISCOPECLAIM";
                    options.ApiScope.Name = "IS4_APISCOPE";
                    options.ApiSecret.Name = "IS4_APISECRET";
                    options.ClientClaim.Name = "IS4_CLIENTCLAIM";
                    options.ClientCorsOrigin.Name = "IS4_CLIENTCORSORIGIN";
                    options.ClientGrantType.Name = "IS4_CLIENTGRANTTYPE";
                    options.ClientIdPRestriction.Name = "IS4_CLIENTIDPRESTRICTION";
                    options.ClientPostLogoutRedirectUri.Name = "IS4_CLIENTPOSTLOGOUTREDIRECTURI";
                    options.ClientProperty.Name = "IS4_CLIENTPROPERTY";
                    options.ClientRedirectUri.Name = "IS4_CLIENTREDIRECTURI";
                    options.Client.Name = "IS4_CLIENT";
                    options.ClientScopes.Name = "IS4_CLIENTSCOPE";
                    options.ClientSecret.Name = "IS4_CLIENTSECRET";
                    options.IdentityClaim.Name = "IS4_IDENTITYCLAIM";
                    options.IdentityResourceProperty.Name = "IS4_IDENTITYPROPERTY";
                    options.IdentityResource.Name = "IS4_IDENTITYRESOURCE";
                })
                .AddOperationalStore(options => {
                    options.ConfigureDbContext = b =>
                        b.UseOracle(connectionString, optionsBuilder =>
                            optionsBuilder.MigrationsAssembly(assemblyNamespace)
                                .UseOracleSQLCompatibility("12"));
                    options.DefaultSchema = "X13663";
                    options.DeviceFlowCodes.Name = "IS4_DEVICECODE";
                    options.PersistedGrants.Name = "IS4_PERSISTEDGRANT";
            });
            return builder;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...