У меня есть 2 вопроса:
1) Как запустить метод Seed() из консоли диспетчера пакетов без обновления модели базы данных?
2) Есть ли способ вызова метода Seed() в коде?
спасибо для любых советов.
У меня есть 2 вопроса:
1) Как запустить метод Seed() из консоли диспетчера пакетов без обновления модели базы данных?
2) Есть ли способ вызова метода Seed() в коде?
спасибо для любых советов.
После исследования я, наконец, нашел обходной путь для этой проблемы:
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();
Отвечая на ваш первый вопрос. Создайте миграцию, запустив add-migration SeedOnly
Сбросьте все коды Up() и Down(), сгенерированные при наличии ожидающих изменений
public partial class SeedOnly : DbMigration
{
public override void Up()
{
}
public override void Down()
{
}
}
Затем вы можете настроить целевую миграцию, запустив update-database -TargetMigration SeedOnly в консоли диспетчера пакетов
Ответ на вопрос №2: Извлеките весь код из метода Seed() в другой класс. Затем вызовите это из метода Seed() из класса Configuration:
protected override void Seed(DbContext ctx)
{
new DatabaseSeed().Seed(ctx);
}
Затем вы можете вызвать его из любого места:
new DatabaseSeed().Seed(new DbContext());
Ответ на вопрос 1:
Люди обычно работают вокруг этого:
ссылка: http://blog.oneunicorn.com/2013/05/28/database-initializer-and-migrations-seed-methods/
Это не совсем то, что вы ищете, но посмотрите: Запуск миграции платформы Entity Framework через подсказку командной строки Это может помочь вам или кому-то забыть миграцию базы данных на основе приложений, поскольку вы можете легко запускать скрипты автоматически...
Если вы используете контекстный initiliazer как MigrateDatabaseToLatestVersion, метод семян в конфигурации должен запускаться автоматически. Не думайте, что вам нужно вызвать его вручную.
Добавьте новый открытый метод в класс Configuration
. Новый метод вызывает только защищенный метод Seed
:
public void RunSeed(DbContext db)
{
Seed(db);
}
Затем вызовите новый метод, например, из. unit тест:
var db = new SomeDbContext();
var configuration = new Configuration();
configuration.RunSeed(db);
Я знаю, что это очень старый вопрос, но в случае, если кто-то попадет сюда и с целью обмена информацией:
Для меня самый простой способ ответить на вопрос 1 - это сначала решить вопрос 2, а затем использовать результат для решения первого. И это было бы так же просто, как ответ @leifbattermann выше (fooobar.com/questions/209620/...) или метод @Martin Staufcik, а затем просто вызовите функцию/метод в некотором фрагменте кода, который вы можете запускать в любое время, с удивительным преимуществом, что его можно использовать для установки значений по умолчанию в некоторых сценариях, таких как создание новых баз данных для новых клиентов, среди прочего.
Только не забывайте, что если вы используете метод @leifbattermann и вызываете функцию из другого места, кроме класса Configuration, и создаете новый DbContext, вам нужно вызвать SaveChanges() после. По крайней мере, для меня это был путь.
Еще одна вещь: если у вас нет отложенных миграций и вы просто хотите начать, просто запустите команду "update-database" в консоли диспетчера пакетов.
Если вы хотите Update-Database --Target-Migration xxx
, и вы удивлены, поскольку я был тем, что метод seed()
не был запущен, вы можете попробовать git stash
все свои изменения, сгенерировать базу данных из предыдущей версии с помощью Update-Database
(для последнего который работает seed()
всегда) и git stash apply
затем.
Это уродливое обходное решение, но это помогло мне.
Btw: не забудьте скомпоновать ваши изменения перед тем, как сшить