Образец IdentityServer4 с удостоверением ASP для реального сервера SQL - PullRequest
0 голосов
/ 25 мая 2018

Я изо всех сил пытался заставить последний ОБРАЗЕЦ (ASP.Net, EF Core, SQL) работать на реальном SQL Server.Каждый образец, который я могу найти, не использует реальный SQL, который они всегда выбирают для хранения данных в памяти

Я изменил строку подключения

"Data Source=.;Initial Catalog=IS4;Integrated Security=True;"

и запустил

dotnet ef database update -c ApplicationDbContext

Это создало мне базу данных SQL с 25 таблицами.

Я настроил Startup.cs, чтобы изменить

        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(connectionString));

и b.UseSqlite на b.UseSqlServer

            .AddConfigurationStore(options =>
            {
                options.ConfigureDbContext = b =>
                    b.UseSqlServer(connectionString,
                        sql => sql.MigrationsAssembly(migrationsAssembly));
            })
            // this adds the operational data from DB (codes, tokens, consents)
            .AddOperationalStore(options =>
            {
                options.ConfigureDbContext = b =>
                    b.UseSqlServer(connectionString,
                        sql => sql.MigrationsAssembly(migrationsAssembly));

                // this enables automatic token cleanup. this is optional.
                options.EnableTokenCleanup = true;
                // options.TokenCleanupInterval = 15;
            });

Iзапустил сервер с параметром "/ seed" в командной строке, но функция Seed не работает

Сначала он жалуется, что у CLIENT не может быть NULL ID, когда он вызывает SaveChanges ().Если я изменю код для добавления идентификатора

        if (!context.Clients.Any())
        {
            Console.WriteLine("Clients being populated");
            int i = 1;
            foreach (var client in Config.GetClients().ToList())
            {
                var x = client.ToEntity();
                x.Id = i++;
                context.Clients.Add(x);
            }
            context.SaveChanges();
        }
        else
        {
            Console.WriteLine("Clients already populated");
        }

, я получу

"Cannot insert the value NULL into column 'Id', table 'IS4.dbo.ClientGrantTypes".

Когда я смотрю видео, оно говорит, что его можно перенести с SQLite на полный SQL, просто изменивСтрока подключения, которая, очевидно, не соответствует действительности, учитывая все другие изменения, которые я сделал, поэтому я должен делать (или пропускать) что-то еще.

Есть мысли?

Ответы [ 2 ]

0 голосов
/ 20 июля 2018

Для решения этой конкретной проблемы я использовал SSMS.

  1. щелкните правой кнопкой мыши таблицу
  2. выберите сценарий для удаления и создайте
  3. добавьте IDENTITY после NOT NULL
  4. Выполнить

Однако, если вы правы, он использует аннотации sqlite в файле sql и в миграциях.

Чтобы полностью решить эту проблему, необходимо создатьреализация всех трех необходимых контекстов базы данных: идентификация, постоянное предоставление и конфигурация.

Для этого требуется реализация фабрик времени проектирования для каждого из этих контекстов.

Затем вы можете запустить add-migration в консоли диспетчера пакетов для каждого из этих контекстов, а затем запустите обновление базы данных или запустите приложение с функцией migrate при заполнении.

Итак, резюмируем:

  1. Создатьреализации для контекстов 3 дБ
  2. Создание реализаций фабрики времени разработки для этих контекстов дБ
  3. Добавление миграций
  4. Обновление данныхсмириться с этими миграциями
0 голосов
/ 25 мая 2018

Может ли быть так, что все таблицы со столбцом "Id INT" должны быть столбцами IDENTITY, а они нет!

Я проверил код миграции, и он имеет

protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.CreateTable(
                name: "ApiResources",
                columns: table => new
                {
                    Id = table.Column<int>(nullable: false)
                        .Annotation("Sqlite:Autoincrement", true),
                    Description = table.Column<string>(maxLength: 1000, nullable: true),
                    DisplayName = table.Column<string>(maxLength: 200, nullable: true),

Я предполагаю, что

.Annotation("Sqlite:Autoincrement", true),

не работает с полным SQL, и поэтому все таблицы нуждаются в настройке свойств идентификации.

Интересно, если вы запустите другой шаблон для добавления AdminUI

dotnet new is4admin

Кажется, что добавлено несколько сценариев SQL

CREATE TABLE "Clients" (
    "Id" INTEGER NOT NULL CONSTRAINT "PK_Clients" PRIMARY KEY AUTOINCREMENT,
    "AbsoluteRefreshTokenLifetime" INTEGER NOT NULL,
    "AccessTokenLifetime" INTEGER NOT NULL,

, которые делают их столбцами идентификаторов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...