web-dev-qa-db-ja.com

テーブルを作成し、EFコードの最初の移行中にデータを挿入する

Entity Framework Code FirstとCode First Migrationsを使用しています。

移行中、新しいテーブルを作成し、そこにデータを挿入する必要があります。

だから私はテーブルを作成します:

CreateTable("MySchema.MyNewTable",
    c => new
    {
        MYCOLUMNID = c.Int(nullable: false, identity: true),
        MYCOLUMNNAME = c.String(),
     })
   .PrimaryKey(t => t.MYCOLUMNID);

それから私はでデータを挿入しようとします:

using (var context = new MyContext())
{
    context.MyNewTableDbSet.AddOrUpdate(new[]
    {
    new MyNewTable
    {
       MYCOLUMNNAME = "Test"
    }
    });
    context.SaveChanges();
}

しかし、エラーが発生します:

無効なオブジェクト名 'mySchema.MyNewTable'。

必要なことを行うことはできますか?同じ移行でテーブルを作成し、それにデータを挿入しますか?

テーブルを作成したり、テーブルにデータを挿入したりする他の移行はすでに行っていますが、同じ移行ではありません...

13
Gab

私の推奨は、コードを Seed メソッドに挿入することです。 Migrationsは DbMigrationsConfiguration クラスに独自のSeedメソッドを導入しました。このSeedメソッドは、2つの重要な点でデータベース初期化子Seedメソッドとは異なります。

  • Update-Database PowerShellコマンドが実行されます。 Migrationsイニシャライザが使用されていない限り、アプリケーションの起動時にMig​​rations Seedメソッドは実行されません。
  • Migrationsはデータベースを削除して再作成するのではなく進化させているため、データベースにすでにデータが含まれているケースを処理する必要があります。

その最後の理由から、AddOrUpdateメソッドでSeed拡張メソッドを使用すると便利です。 AddOrUpdateは、エンティティがデータベースにすでに存在するかどうかを確認し、存在しない場合は新しいエンティティを挿入するか、存在する場合は既存のエンティティを更新します。

したがって、この方法で必要なスクリプトを実行してみてください。

 Update-Database –TargetMigration: ScriptName 

そして、Seedメソッドはデータを挿入する仕事をします。

ジュリー・ラーマンが彼女に言ったように blog

AddOrUpdateの役割は、開発中にデータをシードするときに重複を作成しないようにすることです。

15
octavioccl

このアプローチを試すことができます。テーブルを作成した後、次を使用してパッケージマネージャーコンソールで別の空の移行を作成します。

_Add-Migration "MigrationName"
_

次に、その移行の_.cs_ファイルを開き、Up()メソッドに次のコードを挿入します。

_Sql("INSERT INTO MyNewTable(NyColumnName) Values('Test')");
_

その後、保存してパッケージマネージャーコンソールに戻り、次のコマンドを使用してデータベースを更新します。

_Update-Database
_
11

移行で「ランダム」なことを行う方法は、 Sql method を使用して、データの挿入など、実行する必要のあるSQLステートメントを渡すことです。

これは、移行でデータ操作を含む完全な移行SQLスクリプトを生成できるようにする場合に最適なアプローチです(Seedメソッドはコードでのみ実行でき、何も生成しません) sqlスクリプト)。

7

_EF Core_ソリューションを探している人のために、Upメソッドで、テーブルを作成した後:

つまり、_migrationBuilder.CreateTable(name: "MyTable", ....._

次のコードを追加します。

migrationBuilder.InsertData(table: "MyTable", column: "MyColumn", value: "MyValue");

または

migrationBuilder.InsertData(table: "MyTable", columns: ..., values: ...);

詳細については、ドキュメントを参照してください。 MigrationBuilder.InsertDataメソッド

1
Hizabr