Entity Framework 6 обновляет базу данных программно без автоматизации c миграция - PullRequest
0 голосов
/ 20 февраля 2020

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

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

Я попытался поиграться с DbMigrator, но вызов метода Update (), похоже, ничего не делает, кроме как выкидывает много sqlerrors. Инициализатор MigrateDatabaseToLatestVersion показался многообещающим, потому что он фактически обновил базу данных, но после этого мое приложение отказалось соединяться с базой данных, в основном предлагая мне активировать автоматические c -миграции.

Пока единственный способ, которым я мог получить БД, с которой нужно работать, - это ввести «update-database» в консоль менеджера пакетов. Есть ли какой-нибудь способ, которым я могу просто вызвать программно, что бы я ни вызывал, когда я набираю «update-database» в консоли диспетчера пакетов?

1 Ответ

0 голосов
/ 27 февраля 2020

Следующая комбинация теперь работает как шарм:

Я включил миграции, но сохранил автоматические c -миграции отключены. (enable-migrations)

Я добавил несколько миграций, некоторые с автоматическим содержимым c, некоторые написаны вручную. (add -igration {name})

В папке Migrations была создана Конфигурация, которую я изменил, чтобы она выглядела следующим образом:

  internal sealed class Configuration : DbMigrationsConfiguration<MyDbContext>
{
    public Configuration()
    {
      AutomaticMigrationsEnabled = false;
      AutomaticMigrationDataLossAllowed = false;
      ContextKey = "MyDbContext";
    }

    protected override void Seed(StratonLocalizerDatabase context)
    {
        //  This method will be called after migrating to the latest version.

        //  You can use the DbSet<T>.AddOrUpdate() helper extension method
        //  to avoid creating duplicate seed data.
    }
}

И конструктор для моего DbContext выглядит следующим образом :

    public class MyDbContext: DbContext
  {
    [Obsolete("This constructor should never be used directly, and is only needed to generate entityframework stuff. Connection string can be adapted as pleased.")]
    public MyDbContext() : base(@"Server=MyServer\Instance;Database=MyDatabase;Trusted_Connection=True;")
    {

    }

    public MyDbContext(string connectionString) : base(connectionString)
    {
      Database.CreateIfNotExists();
      Database.SetInitializer(new MigrateDatabaseToLatestVersion<StratonLocalizerDatabase, Migrations.Configuration>());
      Database.Initialize(false);
    }

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

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

Используемая версия Entity Framework: EF6, версия пакета NuGet 6.4.0 с EntityFrameworkExtras.EF6, версия пакета NuGet 1.0.0

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