Как запустить метод Seed () класса Configuration миграций

У меня есть 2 вопроса:

1) Как запустить метод Seed () из консоли менеджера пакетов без модели обновления базы данных?

2) Есть ли способ, как вызвать метод Seed () в коде?

Спасибо за любой совет.

 allen101 нояб. 2016 г., 15:36
Я столкнулся с этой проблемой с EF6 и затем понял, что выбрал неправильный Проект по умолчанию, поэтому база данных обновления не нашла конфигурацию для запуска. Приятно отметить, что простое обновление базы данных в EF6 всегда запускает метод Seed (). Я неНе знаю, было ли это правдой в то время, когда это было написано.

Ответы на вопрос(8)

Ответ на вопрос № 2: Извлеките весь код из метода Seed () в другой класс. Затем вызовите это изнутри метода Seed () из класса Configuration:

    protected override void Seed(DbContext ctx)
    {
        new DatabaseSeed().Seed(ctx);
    }

Тогда вы можете позвонить из любой точки мира:

    new DatabaseSeed().Seed(new DbContext());

Ответ на вопрос 1:

Люди обычно работают вокруг этого:

Временное искусственное изменение моделиПереключение на DropCreateDatabaseAlways, в результате чего база данных часто удаляется и воссоздается, когда она не нужнаУдаление базы данных вручную

ссылка:http://blog.oneunicorn.com/2013/05/28/database-initializer-and-migrations-seed-methods/

Если вы используете контекстный инициализатор как MigrateDatabaseToLatestVersion, начальный метод в конфигурации должен запускаться автоматически. Дон»Я думаю, вам нужно вызвать его вручную.

 Maris30 мая 2013 г., 09:38
Но что, если я хочу назвать это вручную? Я сделал update-database в консоли диспетчера пакетов и запустил мой метод Seed (). Но я после этого делаю некоторую работу, которая удаляет информацию в БД. Поэтому я хочу запускать метод Seed () независимо от update-database. Есть идеи?
 Ravi09 июл. 2013 г., 16:51
Одним из вариантов является создание сценария SQL для использования его при миграции. это может быть достигнуто с помощью update-database -script -targetmigration: <миграционное имя>, После того, как сценарий создан, вы можете добавить любую начальную информацию, которую хотите в конце сценария. Это будут SQL-операторы вставки. Вы можете запустить скрипт в методе up созданного файла миграции.

Если хотитеUpdate-Database --Target-Migration xxx и ты удивлен как я былseed() метод не был запущен, вы можете попробоватьgit stash все ваши изменения, создать базу данных из предыдущей версии, используяUpdate-Database (до последней ревизии, которая выполняетсяseed() всегда) иgit stash apply затем.

Это уродливый обходной путь, но он мне помог.

Кстати: не надоне забудьте поставить ваши изменения перед копированием

 tofutim05 янв. 2018 г., 00:57
хорошо, это довольно уродливоусмешка

Это не совсем то, что вы ищете, но посмотрите:Запуск Entity Framework Migrations через командную строку Это может помочь вам или кому-то забыть о переносе баз данных на основе приложений, поскольку вы можете легко создавать сценарии для автоматического запуска ...

 Maris03 окт. 2016 г., 07:43
Да, это может быть полезно для CI. Благодарю.

Добавьте новый публичный метод вConfiguration учебный класс. Новый метод вызывает только защищенный метод:Seed

public void RunSeed(DbContext db)
{
    Seed(db);
}

Затем вызовите новый метод, например, из. модульный тест:

var db = new SomeDbContext();
var configuration = new Configuration();
configuration.RunSeed(db);
Решение Вопроса

После исследования я наконец нашел решение этой проблемы:

1) сделатьConfiguration общественности:

public sealed class Configuration : DbMigrationsConfiguration

2) Добавьте код ниже в любом месте. Он запустит последнюю миграцию и обновит вашу базу данных:

Configuration configuration = new Configuration();
configuration.ContextType = typeof(YourContextClassHere);
var migrator = new DbMigrator(configuration);

//This will get the SQL script which will update the DB and write it to debug
var scriptor = new MigratorScriptingDecorator(migrator);
string script = scriptor.ScriptUpdate(sourceMigration: null, targetMigration: null).ToString();
Debug.Write(script);

//This will run the migration update script and will run Seed() method
migrator.Update();
 Peter Kerr09 апр. 2014 г., 17:32
Это ответит на вторую часть вопросов, но как насчет первой части Как я могу запустить метод Seed () из консоли менеджера пакетов без модели update-database?
 Snæbjørn31 июл. 2014 г., 10:25
Я второй это ..

Отвечая на ваш первый вопрос. Создайте миграцию, запустив надстройку SeedOnly

Очистить весь код Up () и Down (), сгенерированный, если были какие-либо ожидающие изменения

public partial class SeedOnly : DbMigration
{
    public override void Up()
    {
    }

    public override void Down()
    {
    }
}

Затем вы можете настроить таргетинг на конкретную миграцию, запустив update-database -TargetMigration SeedOnly в консоли диспетчера пакетов.

 Ehsan8822 авг. 2016 г., 18:49
Я полагаю, это лучший ответ. Удивительно, у него слишком мало голосов!

Ваш ответ на вопрос