Подтвердить что ты не робот

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

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

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

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

спасибо для любых советов.

4b9b3361

Ответ 1

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

1) Сделайте Configuration public:

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();

Ответ 2

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

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

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

    public override void Down()
    {
    }
}

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

Ответ 3

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

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

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

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

Ответ 4

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

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

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

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

Ответ 6

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

Ответ 7

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

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

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

var db = new SomeDbContext();
var configuration = new Configuration();
configuration.RunSeed(db);

Ответ 8

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

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

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

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

Ответ 9

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

Это уродливое обходное решение, но это помогло мне.

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