web-dev-qa-db-ja.com

コードファースト環境でパッケージマネージャーコンソールからデータベースを更新する

コードファースト環境

パッケージマネージャーコンソールからデータベースを更新しようとしています。ドメインクラスが変更された場合、データベースを削除するのではなく、データベースを削除して作成する必要があります。

私はすでにグーグルでいくつかのブログを読んでみました。

コマンド

PM> Install-Package EntityFramework
  1. このコマンドを使用して、Entity Frameworkを正常にインストールします。

     PM> Enable-Migrations
    
  2. このコマンドを使用して、プロジェクトに移行ファイルを作成しました。

     PM> Update-Database
    
  3. このコマンドを使用すると、テーブルを更新できますが、問題はこちらになります。

エラー

「-Verbose」フラグを指定して、ターゲットデータベースに適用されているSQLステートメントを表示します。 System.Data.SqlClient.SqlException(0x80131904):SQL Serverへの接続の確立中にネットワーク関連またはインスタンス固有のエラーが発生しました。サーバーが見つからなかったか、アクセスできませんでした。インスタンス名が正しいこと、およびSQL Serverがリモート接続を許可するように構成されていることを確認してください。

疑いはここにある

[〜#〜] poco [〜#〜] Classで1つのフィールドのみが変更されると、更新される場合があります。たとえば、ドメインクラスの数を更新しました。パッケージマネージャーコンソールからデータベースを更新するにはどうすればよいですか。何か案が ?

23
vinodh

接続文字列は、ConnectionStringパラメーターを介して指定できます。

Update-Database -ConnectionString "data source=server_name;initial catalog=db_name;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" -ConnectionProviderName "System.Data.SqlClient" -Verbose

また、Add-Migrationコマンドと同じ値でこのパラメーターを使用する必要があります。

Add-Migration Version_Name -ConnectionString "data source=server_name;initial catalog=db_name;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" -ConnectionProviderName "System.Data.SqlClient" -Verbose

私は使った

Enable-Migrations -EnableAutomaticMigrations -Force

それから

Update-Database

そして、これにより、テストデータを保持しながら、変更(追加の列)が移行されました。これがプロトタイピング中の最も遅延なオプションだと思います。

5
toddmo

複数の問題があるようです。データベースを削除して再作成したくないことに関しては、データベース初期化子によって決定されます。移行を使用する場合は、MigrateDatabaseToLatestVersionに変更します。 http://www.codeguru.com/csharp/article.php/c19999/Understanding-Database-Initializers-in-Entity-Framework-Code-First.htm

2番目に、変更するフィールドの数は問題ではなく、最後の移行からの変更に基づいて単一の移行にロールされます。

第三に、他の人が指摘したように、接続文字列の問題があるようです。これをAdd-MigrationおよびUpdate-Migrationに追加できますが、おそらくアプリケーションで修正します。構成ファイル(ASP.NETのweb.config)を指すコンテキストのコンストラクターに私のものを設定します。

public class ApplicationDbContext : DbContext
{
    public ApplicationDbContext()
        : base("MyConnection", throwIfV1Schema: false)
    {
        Database.SetInitializer<ApplicationDbContext>(new MigrateDatabaseToLatestVersion<ApplicationDbContext, MyObjextContextMigration>());
    }
    ...
2
Steve Greene

接続文字列をどこに配置しますか?

パッケージマネージャーコンソールのすべてのコマンドで指定する必要はありません。 DbContextクラス(「from DbContext派生クラス」)が存在するプロジェクトのappsettings.jsonに配置できます。

{
  "ConnectionStrings": {
    "MyConnectionString": "Server=yourServer;Port=5432;Database=yourDatabase;User Id=yourDatabaseUsername;Password=yourDatabasePassword;"
  }
}

移行に使用されます。

重要:ソリューションに複数のプロジェクトがある場合、必須「デフォルトプロジェクト」-ドロップダウン(パッケージマネージャーコンソール内)でプロジェクトを選択し、必須を設定しますプロジェクトをスタートアッププロジェクトとして(ソリューションエクスプローラーで)。

そうしないと、誤った/異なる接続文字列で誤ったappsettings.jsonが使用される可能性があります。

これはEF Core 2.1での私の経験であり、おそらくEFの他のバージョンにも当てはまります。

1
RWC

SSDTを更新する必要があります。ツール>拡張機能と更新>更新> SQLサーバーデータツールに移動します

0
aya mourad