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

Имам 2 въпроса:

1) Как мога да стартирам метода Seed() от конзолата на мениджъра на пакети, без да актуализирам модела на базата данни?

2) Има ли начин как да се извика Seed() метод в кода?

Благодаря за всякакви съвети.


person Maris    schedule 28.05.2013    source източник
comment
Сблъсках се с този проблем с EF6 и след това разбрах, че съм избрал грешния проект по подразбиране, така че базата данни за актуализиране не намери конфигурация за изпълнение. Добре е да се отбележи, че просто извършването на актуализация на база данни в EF6 винаги ще изпълнява метода Seed(). Не знам дали това беше вярно по времето, когато това беше написано.   -  person allen1    schedule 01.11.2016
comment
Имах проблем, при който началният метод не беше извикан, но работех с модификатора - скрипт. Премахнете това и се извиква началният метод.   -  person Jon L    schedule 01.06.2021


Отговори (9)


Отговарям на първия ви въпрос. Създайте миграция, като стартирате SeedOnly за добавяне на миграция

Изчистете целия генериран код Up() и Down(), ако има чакащи промени

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

    public override void Down()
    {
    }
}

След това можете да насочите към конкретна миграция, като изпълните update-database -TargetMigration SeedOnly в конзолата на Package Manager

person De Wet Ellis    schedule 30.12.2015
comment
Предполагам, че това е най-добрият отговор. Удивително е, че има твърде малко гласове за! - person Ehsan88; 22.08.2016

След проучване най-накрая намерих решението за този проблем:

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();
person Maris    schedule 27.06.2013
comment
Това отговаря на втората част от въпросите, но какво да кажем за първата част. Как мога да стартирам метода Seed() от конзолата на мениджъра на пакети, без да актуализирам модела на базата данни? - person Peter Kerr; 09.04.2014

Отговор на въпрос №2: Извлечете целия код от метода Seed() в друг клас. След това извикайте това от метода Seed() от класа Configuration:

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

След това можете да го извикате отвсякъде:

    new DatabaseSeed().Seed(new DbContext());
person leifbattermann    schedule 25.06.2014
comment
Методът AddOrUpdate е метод на DbContext, така че това не работи. - person David Sopko; 17.08.2020

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

Хората обикновено заобикалят това чрез:

  1. Извършване на временна изкуствена промяна на модела
  2. Превключване към DropCreateDatabaseAlways, в резултат на което базата данни често се премахва и създава отново, когато не е необходима
  3. Ръчно изтриване на базата данни

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

person Farb    schedule 31.12.2015

Това не е точно това, което търсите, но все пак погледнете: Изпълнение на Entity Framework Миграции чрез подкана за команден ред Това може да помогне на вас или на някой да забравите миграцията на база данни, базирана на приложения, защото можете лесно да накарате скриптовете да се изпълняват автоматично...

person soreal    schedule 30.09.2016
comment
Да, може да е полезно за CI. Благодаря. - person Maris; 03.10.2016

Ако използвате инициализатор на контекст като MigrateDatabaseToLatestVersion, началният метод в конфигурацията трябва да се изпълнява автоматично. Не мислете, че трябва да го извиквате ръчно.

person Ravi    schedule 29.05.2013
comment
Но какво, ако искам да го извикам ръчно? Направих актуализирана база данни в конзолата на мениджъра на пакети и стартирах моя метод Seed(). Но аз след това правя някаква работа, която изтрива информацията в DB. Така че искам да стартирам метода Seed() независимо от базата данни за актуализиране. Някакви идеи? - person Maris; 30.05.2013
comment
Една от възможностите е да създадете sql скрипт за използването му при миграция. това може да се постигне чрез използване на update-database -script -targetmigration:‹име на миграция›. След като скриптът е създаден, можете да добавите всяка начална информация, която искате в края на скрипта. Това биха били изрази за вмъкване на sql. Можете да стартирате скрипта в метода up на създадения файл за миграция. - person Ravi; 09.07.2013

Добавете нов публичен метод в класа Configuration. Новият метод извиква само защитения метод Seed:

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

След това извикайте новия метод от напр. единичен тест:

var db = new SomeDbContext();
var configuration = new Configuration();
configuration.RunSeed(db);
person Martin Staufcik    schedule 29.03.2018

Знам, че това е много стар въпрос, но в случай, че някой удари тук и с цел споделяне на информация:

За мен най-лесният начин да отговоря на въпрос 1 би бил първо да реша въпрос 2 и след това да използвам резултата за решаване на първия. И това би било нещо толкова просто, колкото @leifbattermann отговори по-горе (https://stackoverflow.com/a/24413407/2996749 ) или метод @Martin Staufcik също и след това просто извикайте функцията/метода в някакъв код, който можете да стартирате, когато пожелаете, с удивителното предимство, че може да се използва за задаване на стойности по подразбиране в някои сценарии като създаване на нови бази данни за нови клиенти, между другото.

Само не забравяйте, че ако използвате метода @leifbattermann и извиквате функцията от място, различно от класа Configuration и създавате нов DbContext, трябва да извикате SaveChanges() след това. Поне за мен това беше начинът.

Само още нещо: ако нямате висящи миграции и просто искате да стартирате, просто стартирайте командата "update-database" в конзолата на Package Manager, ще свърши работа.

person rjr.sousa    schedule 18.07.2019

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

Това е грозно решение, но ми помогна.

Между другото: не забравяйте да поставите промените си преди скриване

person lukyer    schedule 10.03.2017