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

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

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

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

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


person Maris    schedule 28.05.2013    source источник
comment
Я столкнулся с этой проблемой с EF6, а затем понял, что выбрал неправильный проект по умолчанию, поэтому база данных обновления не нашла конфигурацию для запуска. Стоит отметить, что простое обновление базы данных в EF6 всегда будет запускать метод Seed(). Я не знаю, было ли это правдой в то время, когда это было написано.   -  person allen1    schedule 01.11.2016
comment
У меня была проблема, когда метод seed не вызывался, но я работал с модификатором -script. Удалите это, и будет вызван метод seed.   -  person Jon L    schedule 01.06.2021


Ответы (9)


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

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

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

    public override void Down()
    {
    }
}

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

person De Wet Ellis    schedule 30.12.2015
comment
Я полагаю, что это лучший ответ. Удивительно, что у него слишком мало голосов! - person Ehsan88; 22.08.2016

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

1) Сделать Configuration общедоступным:

public sealed class Configuration : DbMigrationsConfiguration<YourContextClassHere>

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();
person Maris    schedule 27.06.2013
comment
Это отвечает на вторую часть вопросов, но как насчет первой части. Как запустить метод Seed() из консоли диспетчера пакетов без обновления модели базы данных? - person Peter Kerr; 09.04.2014

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

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

Затем вы можете вызвать его из любого места:

    new DatabaseSeed().Seed(new DbContext());
person leifbattermann    schedule 25.06.2014
comment
Метод AddOrUpdate является методом DbContext, поэтому он не работает. - person David Sopko; 17.08.2020

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

Люди обычно обходили это одним из следующих способов:

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

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

person Farb    schedule 31.12.2015

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

person soreal    schedule 30.09.2016
comment
Да, это может быть полезно для CI. Спасибо. - person Maris; 03.10.2016

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

person Ravi    schedule 29.05.2013
comment
Но что, если я хочу вызвать это вручную? Я создал базу данных обновлений в консоли диспетчера пакетов и запустил метод Seed(). Но я после этого делаю какую-то работу, которая удаляет информацию в БД. Поэтому я хочу запустить метод Seed() независимо от базы данных обновления. Есть идеи? - person Maris; 30.05.2013
comment
Одним из вариантов является создание сценария sql для использования его при миграции. это может быть достигнуто с помощью update-database -script -targetmigration:‹имя миграции›. После того, как сценарий создан, вы можете добавить любую начальную информацию, которую хотите, в конце сценария. Это будут операторы вставки sql. Вы можете запустить скрипт в методе up созданного файла миграции. - person Ravi; 09.07.2013

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

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

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

var db = new SomeDbContext();
var configuration = new Configuration();
configuration.RunSeed(db);
person Martin Staufcik    schedule 29.03.2018

Я знаю, что это очень старый вопрос, но на случай, если кто-то попадет сюда и с целью обмена информацией:

Для меня самым простым способом ответить на вопрос 1 было бы сначала решить вопрос 2, а затем использовать результат для решения первого. И это будет так же просто, как @leifbattermann ответил выше (https://stackoverflow.com/a/24413407/2996749 ) или метод @Martin Staufcik, а затем просто вызовите функцию/метод в некотором фрагменте кода, который вы можете запустить, когда захотите, с удивительным преимуществом, которое можно использовать для установки значений по умолчанию в некоторых сценариях, таких как создание новых баз данных для новых клиентов, среди прочего.

Только не забывайте, что если вы используете метод @leifbattermann и вызываете функцию из другого места, кроме класса Configuration, и создаете новый DbContext, вам нужно после этого вызвать SaveChanges(). По крайней мере, для меня это было так.

Еще одна вещь: если у вас нет ожидающих миграций и вы просто хотите раздать, просто запустите команду «update-database» в консоли диспетчера пакетов.

person rjr.sousa    schedule 18.07.2019

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

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

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

person lukyer    schedule 10.03.2017