Имам 2 въпроса:
1) Как мога да стартирам метода Seed() от конзолата на мениджъра на пакети, без да актуализирам модела на базата данни?
2) Има ли начин как да се извика Seed() метод в кода?
Благодаря за всякакви съвети.
Имам 2 въпроса:
1) Как мога да стартирам метода Seed() от конзолата на мениджъра на пакети, без да актуализирам модела на базата данни?
2) Има ли начин как да се извика Seed() метод в кода?
Благодаря за всякакви съвети.
Отговарям на първия ви въпрос. Създайте миграция, като стартирате SeedOnly за добавяне на миграция
Изчистете целия генериран код Up() и Down(), ако има чакащи промени
public partial class SeedOnly : DbMigration
{
public override void Up()
{
}
public override void Down()
{
}
}
След това можете да насочите към конкретна миграция, като изпълните update-database -TargetMigration SeedOnly в конзолата на Package Manager
След проучване най-накрая намерих решението за този проблем:
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();
Отговор на въпрос №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 Миграции чрез подкана за команден ред Това може да помогне на вас или на някой да забравите миграцията на база данни, базирана на приложения, защото можете лесно да накарате скриптовете да се изпълняват автоматично...
Ако използвате инициализатор на контекст като MigrateDatabaseToLatestVersion, началният метод в конфигурацията трябва да се изпълнява автоматично. Не мислете, че трябва да го извиквате ръчно.
Добавете нов публичен метод в класа Configuration
. Новият метод извиква само защитения метод Seed
:
public void RunSeed(DbContext db)
{
Seed(db);
}
След това извикайте новия метод от напр. единичен тест:
var db = new SomeDbContext();
var configuration = new Configuration();
configuration.RunSeed(db);
Знам, че това е много стар въпрос, но в случай, че някой удари тук и с цел споделяне на информация:
За мен най-лесният начин да отговоря на въпрос 1 би бил първо да реша въпрос 2 и след това да използвам резултата за решаване на първия. И това би било нещо толкова просто, колкото @leifbattermann отговори по-горе (https://stackoverflow.com/a/24413407/2996749 ) или метод @Martin Staufcik също и след това просто извикайте функцията/метода в някакъв код, който можете да стартирате, когато пожелаете, с удивителното предимство, че може да се използва за задаване на стойности по подразбиране в някои сценарии като създаване на нови бази данни за нови клиенти, между другото.
Само не забравяйте, че ако използвате метода @leifbattermann и извиквате функцията от място, различно от класа Configuration и създавате нов DbContext, трябва да извикате SaveChanges() след това. Поне за мен това беше начинът.
Само още нещо: ако нямате висящи миграции и просто искате да стартирате, просто стартирайте командата "update-database" в конзолата на Package Manager, ще свърши работа.
Ако искате да Update-Database --Target-Migration xxx
и сте изненадани, както аз бях, че методът seed()
не е стартиран, можете да опитате да git stash
всичките си промени, да генерирате база данни от предишна версия, като използвате Update-Database
(до последната версия, която се изпълнява seed()
винаги) и git stash apply
след това.
Това е грозно решение, но ми помогна.
Между другото: не забравяйте да поставите промените си преди скриване