web-dev-qa-db-ja.com

移行の構成クラスのSeed()メソッドを実行する方法

2つの質問があります。

1)更新データベースモデルなしでパッケージマネージャーコンソールからSeed()メソッドを実行するにはどうすればよいですか?

2)コードでSeed()メソッドを呼び出す方法はありますか?

助言のためのThx。

39
Maris

調査の後、私はついにこの問題の回避策を見つけました。

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();
24
Maris

最初の質問に答えます。 add-migration SeedOnlyを実行して移行を作成する

保留中の変更があった場合、生成されたすべてのUp()およびDown()コードを消去します

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

    public override void Down()
    {
    }
}

次に、パッケージマネージャーコンソールでupdate-database -TargetMigration SeedOnlyを実行して、特定の移行をターゲットにできます。

40
De Wet Ellis

質問2に答える:Seed()メソッドから別のクラスにすべてのコードを抽出します。次に、ConfigurationクラスのSeed()メソッド内から呼び出します。

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

その後、どこからでも呼び出すことができます:

    new DatabaseSeed().Seed(new DbContext());
7
leifbattermann

質問1に答えてください:

人々は通常、次のいずれかの方法でこれを回避します。

  1. モデルに一時的な人為的な変更を加える
  2. DropCreateDatabaseAlwaysに切り替えると、データベースが頻繁に削除され、不要になったときに再作成される結果になる
  3. データベースを手動で削除する

参照: http://blog.oneunicorn.com/2013/05/28/database-initializer-and-migrations-seed-methods/

2
Farb

これはまさにあなたが探しているものではありませんが、見てください: Running Entity Framework Migrations via command line Prompt これはあなたまたは誰かがアプリケーションベースのデータベース移行を忘れるのを助けるかもしれません。自動的に実行するには...

1
soreal

私はこれが非常に古い質問であることを知っていますが、誰かがここでヒットした場合や情報を共有する目的で:

私にとって、質問1に答える最も簡単な方法は、最初に質問2を解決し、その結果を使用して最初の質問を解決することです。そして、それは@leifbattermannが上記で答えたような単純なものです( https://stackoverflow.com/a/24413407/2996749 )または@Martin Staufcikメソッドも、そして単に関数/メソッドを呼び出しますいつでも好きなときに実行できるコードの一部。新しい顧客向けの新しいデータベースの作成など、いくつかのシナリオでデフォルト値を設定するために使用できるという驚くべき利点があります。

@leifbattermannメソッドを使用し、Configurationクラス以外の場所から関数を呼び出して新しいDbContextを作成する場合は、後でSaveChanges()を呼び出す必要があることを忘れないでください。少なくとも私にとっては、それが道でした。

あともう1つ:保留中の移行がなく、シードを実行したい場合は、パッケージマネージャーコンソールでコマンド "update-database"を実行するだけでジョブが実行されます。

0
rjr.sousa

Configurationクラスに新しいパブリックメソッドを追加します。新しいメソッドは、保護されたメソッドSeedのみを呼び出します。

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

次に、例えばから新しいメソッドを呼び出します。単体テスト:

var db = new SomeDbContext();
var configuration = new Configuration();
configuration.RunSeed(db);
0
Martin Staufcik

コンテキストイニシャライザーをMigrateDatabaseToLatestVersionとして使用する場合、構成のシードメソッドは自動的に実行されます。手動で呼び出す必要はないと思います。

0
Ravi