У меня 2 вопроса:Как запустить Seed() метод класса конфигурации миграций
1) Как я могу запустить Seed() метод из консоли пакета-менеджер без модели обновления-баз данных?
2) Есть ли способ вызова метода Seed() в коде?
Thx для любых советов.
У меня 2 вопроса:Как запустить Seed() метод класса конфигурации миграций
1) Как я могу запустить Seed() метод из консоли пакета-менеджер без модели обновления-баз данных?
2) Есть ли способ вызова метода Seed() в коде?
Thx для любых советов.
После исследований я, наконец, нашел обходной путь для этой проблемы:
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();
Это отвечает на вторую часть вопросов, но как насчет первой части Как запустить метод Seed() из консоли диспетчера пакетов без обновления базы данных? –
I второй, что .. –
Если вы используете контекстный инициализатор как MigrateDatabaseToLatestVersion, метод семян в конфигурации должен запускаться автоматически. Не думайте, что вам нужно называть это вручную.
Но что, если я хочу назвать его ручным? Я сделал базу данных обновлений в консоли диспетчера пакетов и запустил метод Seed(). Но я после этого делаю некоторую работу, которая удаляет информацию в БД. Поэтому я хочу запустить метод Seed() независимо от базы данных обновлений. Есть идеи? – Maris
Одним из вариантов является создание SQL-скрипта для его использования в процессе миграции. это может быть достигнуто с помощью update-database -script -targetmigration: <имя миграции>. После создания сценария вы можете добавить любую начальную информацию, которая вам нужна в конце скрипта. Это будут заявления вставки sql. Вы можете запустить скрипт в методе up из созданного файла миграции. – Ravi
Ответ Вопрос № 2: Извлечение всего кода из метода Seed() к другому классу. Тогда зови, что внутри метода Seed() из класса Configuration:
protected override void Seed(DbContext ctx)
{
new DatabaseSeed().Seed(ctx);
}
Тогда вы можете позвонить из любого места:
new DatabaseSeed().Seed(new DbContext());
Отвечая на первый вопрос. Создание миграции путем запуска надстройки миграции SeedOnly
Убирайтесь все вверх() и вниз() код, генерируемый, есть ли ожидающие изменения
public partial class SeedOnly : DbMigration
{
public override void Up()
{
}
public override void Down()
{
}
}
Затем вы можете нацеливания на определенную миграцию при обкатке обновление-базы данных -TargetMigration SeedOnly в консоли Package Manager
Я полагаю, что это лучший ответ. Удивительно, что у него слишком мало оборотов! – ehsan88
Ответ вопрос 1:
Люди обычно работают вокруг этого либо:
ссылка: http://blog.oneunicorn.com/2013/05/28/database-initializer-and-migrations-seed-methods/
Это не совсем то, что вы ищете, но посмотрите: Running Entity Framework Migrations via command line prompt Это может помочь вам или кому-то забыть базу данных на основе приложения mig , потому что вы можете легко запускать скрипты автоматически ...
Yeap, это может быть полезно для CI. Благодарю. – Maris
Если вы хотите Update-Database --Target-Migration xxx
и вы удивитесь, как я, что seed()
метод не был запущен, вы можете попытаться git stash
все ваши изменения, создавать базу данных из предыдущей версии с помощью Update-Database
(к последней версии, которая проходит seed()
всегда) и git stash apply
.
Это уродливое обходное решение, но это помогло мне.
Btw: не забудьте поставить изменения перед припрятать
ОК, это довольно уродливо * усмешка * – tofutim
Я побежал в этом вопросе с EF6, а потом понял, что я был неправильно выбран по умолчанию проекта, так что обновление базы данных, не найти конфигурацию для запуска. Хорошо отметить, что просто выполнение базы данных обновлений в EF6 всегда будет запускать метод Seed(). Я не знаю, было ли это в то время, когда это было написано. – allen1