Ошибка IdentityServer4: не найден DbContext с именем «ConfigurationDbContext» - PullRequest
0 голосов
/ 10 мая 2019

Я пытаюсь подключить персистентность к своему серверу идентификации, добавив платформу сущностей. В настоящее время при попытке добавить миграцию я получаю сообщение об ошибке

Не найден DbContext с именем «ConfigurationDbContext».

Перед запуском миграции у меня есть cd в каталоге, в котором находится мой файл .csproj, и я запускаю dotnet ef migrations add InitConfigration -c ConfigurationDbContext -o Data/Migrations/IdentityServer/Configuration, чтобы попытаться добавить миграцию.

Мой Startup.cs класс выглядит следующим образом:

    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

            services.AddIdentity<ApplicationUser, IdentityRole>()
                .AddEntityFrameworkStores<ApplicationDbContext>()
                .AddDefaultTokenProviders();

            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

            var migrationsAssembly = typeof(ApplicationDbContext).GetTypeInfo().Assembly.GetName().Name;

            services.AddIdentityServer()
                .AddDeveloperSigningCredential()
                .AddAspNetIdentity<ApplicationUser>()
                .AddConfigurationStore(options =>
                {
                    options.ConfigureDbContext = builder =>
                        builder.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"),
                            db => db.MigrationsAssembly(migrationsAssembly));
                })
                .AddOperationalStore(options =>
                {
                    options.ConfigureDbContext = builder =>
                        builder.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"),
                            db => db.MigrationsAssembly(migrationsAssembly));
                });
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseIdentityServer();

            app.UseMvc();
        }
    }

Как я могу решить эту проблему?

РЕДАКТИРОВАТЬ: После дальнейшего изучения, когда я использую флаг --project при генерации миграции следующим образом: dotnet ef migrations add InitConfigration -c ConfigurationDbContext -o Data/Migrations/IdentityServer/Configuration --project BleacherBuddy.IdentityServerService, я получаю ошибку:

MSBUILD: ошибка MSB1009: файл проекта не существует. Невозможно получить метаданные проекта. Убедитесь, что это основанное на MSBuild ядро ​​.NET Проект

Мое текущее предположение состоит в том, что, поскольку это проект фабричной службы (ядро .net без сохранения состояния), процесс сборки здесь терпит неудачу и не позволяет мне сгенерировать миграцию. После некоторого исследования я все еще не уверен, как преодолеть это или это актуальная проблема. Я воссоздал проект простого сервера идентификации в виде веб-API (не используя сервисную фабрику) и смог генерировать классы, как и ожидалось. Вся помощь приветствуется.

1 Ответ

0 голосов
/ 10 мая 2019
dotnet ef migrations add InitConfigration -c ConfigurationDbContext -o Data/Migrations/IdentityServer/Configuration

В этой команде вы явно просите dotnet ef использовать класс ConfigurationDbContext в качестве контекста базы данных.У вас его нет в вашем Startup.cs, поэтому я предполагаю, что у вас это есть в другом месте.В этом случае вам нужно будет дать инструменту полное имя класса, включая пространство имен, поэтому ваша команда должна выглядеть следующим образом:

dotnet ef migrations add InitConfigration -c Fully.Qualified.Namespaces.ConfigurationDbContext -o Data/Migrations/IdentityServer/Configuration

- замените Fully.Qualified.Namespaces. на фактический путь к вашемуConfigurationDbContext class.

UPD:

В качестве альтернативы, поскольку вы фактически настраиваете свою службу идентификации с ApplicationDbContext в качестве хранилища EF, вам может понадобиться использовать тот же контекст в вашей команде:

dotnet ef migrations add InitConfigration -c ApplicationDbContext -o Data/Migrations/IdentityServer/Configuration

В этом случае вам также может потребоваться указать полностью определенное пространство имен перед именем класса контекста.

...