2013-05-28 2 views
28

У меня 2 вопроса:Как запустить Seed() метод класса конфигурации миграций

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

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

Thx для любых советов.

+1

Я побежал в этом вопросе с EF6, а потом понял, что я был неправильно выбран по умолчанию проекта, так что обновление базы данных, не найти конфигурацию для запуска. Хорошо отметить, что просто выполнение базы данных обновлений в EF6 всегда будет запускать метод Seed(). Я не знаю, было ли это в то время, когда это было написано. – allen1

ответ

20

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

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

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

+1

I второй, что .. –

0

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

+0

Но что, если я хочу назвать его ручным? Я сделал базу данных обновлений в консоли диспетчера пакетов и запустил метод Seed(). Но я после этого делаю некоторую работу, которая удаляет информацию в БД. Поэтому я хочу запустить метод Seed() независимо от базы данных обновлений. Есть идеи? – Maris

+0

Одним из вариантов является создание SQL-скрипта для его использования в процессе миграции. это может быть достигнуто с помощью update-database -script -targetmigration: <имя миграции>. После создания сценария вы можете добавить любую начальную информацию, которая вам нужна в конце скрипта. Это будут заявления вставки sql. Вы можете запустить скрипт в методе up из созданного файла миграции. – Ravi

3

Ответ Вопрос № 2: Извлечение всего кода из метода Seed() к другому классу. Тогда зови, что внутри метода Seed() из класса Configuration:

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

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

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

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

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

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

    public override void Down() 
    { 
    } 
} 

Затем вы можете нацеливания на определенную миграцию при обкатке обновление-базы данных -TargetMigration SeedOnly в консоли Package Manager

+2

Я полагаю, что это лучший ответ. Удивительно, что у него слишком мало оборотов! – ehsan88

1

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

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

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

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

1

Это не совсем то, что вы ищете, но посмотрите: Running Entity Framework Migrations via command line prompt Это может помочь вам или кому-то забыть базу данных на основе приложения mig , потому что вы можете легко запускать скрипты автоматически ...

+0

Yeap, это может быть полезно для CI. Благодарю. – Maris

0

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

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

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

+0

ОК, это довольно уродливо * усмешка * – tofutim

 Смежные вопросы

  • Нет связанных вопросов^_^