EF Core App - Как мне написать скрипт для установки? - PullRequest
0 голосов
/ 23 октября 2018

У меня есть EF Core Application (с использованием WPF, C #), который я могу прекрасно создавать и запускать как разработчик.У меня нет проблем с редактированием модели данных, созданием миграций и обновлением базы данных из консоли диспетчера пакетов.Но сейчас я пытаюсь написать установщик (оценивая различные инструменты установки), и мне интересно, что делать во время установки.

Кажется, что вся документация EF Core, которую я могу найти, касается создания базы данных исключительно с точки зрения разработчика.Но я не могу точно запустить консоль менеджера пакетов в моем исходном коде.Тем не менее, как только мое приложение установлено, база данных должна существовать.Я не знаю, как лучше использовать выходные данные, которые EF Core дает мне для создания базы данных во время установки.Каков наилучший метод?

Например, в моем проекте я вижу папку «Миграции», которую EF Core создал для меня, когда я запускал команду add-migration из консоли PM.У него есть класс, производный от «Migration» с методом «Up», который создает таблицы в C #.

public partial class init : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.CreateTable(
            name: "AnalysisTypes",
            columns: table => new
            {
                Key = table.Column<string>(nullable: false),
                Name = table.Column<string>(nullable: true),
                Show = table.Column<bool>(nullable: false)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_AnalysisTypes", x => x.Key);
            });

        ...etc ... etc... etc...

Это кажется , как если бы это было идеально для создания моей базы данных.Как, может быть, мне следует каким-то образом извлечь этот производный от миграции класс в отдельное консольное приложение, которое будет запускаться во время установки для создания базы данных.Обычно это делается?

Альтернативно, если я запускаю команду script-migration -idempotent из консоли PM, я получаю сценарий SQL, который создает нужные мне таблицы.

IF OBJECT_ID(N'[__EFMigrationsHistory]') IS NULL
BEGIN
    CREATE TABLE [__EFMigrationsHistory] (
        [MigrationId] nvarchar(150) NOT NULL,
        [ProductVersion] nvarchar(32) NOT NULL,
        CONSTRAINT [PK___EFMigrationsHistory] PRIMARY KEY ([MigrationId])
    );
END;

GO

CREATE TABLE [AnalysisTypes] (
    [Key] nvarchar(450) NOT NULL,
    [Name] nvarchar(max) NULL,
    [Show] bit NOT NULL,
    CONSTRAINT [PK_AnalysisTypes] PRIMARY KEY ([Key])
);

GO

... etc ... etc... etc...

Но этот скрипт only создает таблицы.У него нет возможности подключиться к базе данных или посмотреть, существует ли она, и создать ее, если ее нет.Мне нужен более умный скрипт для

  • Подключиться к нужному серверу sql
  • Проверьте, существует ли база данных
  • Создайте ее, если ее нет.
  • Убедитесь, что его схема актуальна.

Так я должен взять этот сценарий, сгенерированный при переносе сценария, и обернуть его в какой-нибудь более крупный, который все это работает для меня?Есть какая-нибудь команда, которая сделает все это?

Полагаю, это решенная проблема в мире EF Core.Я просто ищу лучшую практику.Кто-нибудь может дать мне какое-нибудь руководство здесь?

1 Ответ

0 голосов
/ 23 октября 2018

Если у вас уже есть созданная база данных, вы можете настроить инициализатор базы данных на миграцию на самую новую версию, установив вызов SetInitializer .

Database.SetInitializer<ObjectContext>(new MigrateDatabaseToLatestVersion<ObjectContext, Configuration>());

От: https://msdn.microsoft.com/en-us/magazine/dn818489.aspx

Если вы скомпилируете проект и передадите его другому разработчику, который не перенес свою собственную базу данных разработки, инициализатор вызовет приложение для поиска миграции.Миграция будет найдена, потому что она в проекте.Инициализатор проверит таблицу истории миграции базы данных и при необходимости обновит схему базы данных.

Учитывая это на производстве, а не на разработке, класс миграции будет скомпилирован в вашу сборку и развернут как часть приложения.Когда приложение запускается, оно реагирует на параметр MigrateDatabaseToLatestVersion (в соответствующем месте в вашем приложении) и соответствующим образом обновляет схему базы данных.

Подробнее о миграциях можно прочитать здесь здесь .

РЕДАКТИРОВАТЬ

Для EF Core: От: http://flores.eken.nl/ef-core-equivalent-of-migratedatabasetolatestversion/

А теперь важная часть,Конечно, вы хотите, чтобы ваша программа запускала миграцию (и последующие) автоматически при запуске приложения.В дни EF 6.x это можно было сделать с помощью инициализатора базы данных MigrateDatabaseToLatestVersion.

Это изменилось в ядре EF.Теперь вам нужно будет использовать:

context.Database.Migrate();
...