0

ASP.NET Core MVC6とEntity Frameworkコアでアプリケーションを構築しています最初にDB文脈で構築されたコードでは、SQLデータベースには既にデータレコードが設定されています。私は最近、VS2015パッケージマネージャーコンソールのコマンド( "dotnet ef migrations added Stage3"、 "dotnet ef database update")を使用してデータモデルを少し変更し、移行を再現しましたが、エラーが発生しました:Entity Frameworkコアエラー:dotnet.exe:System.Data.SqlClient.SqlException(0x80131904):データベースに「Company」という名前のオブジェクトが既に存在します。

dotnet.exe : System.Data.SqlClient.SqlException (0x80131904): There is already an object named 'Company' in the database. 

Companyテーブルがテーブル関係の最上位にあるため、Company Companyテーブルが既に存在し、EFが新しいテーブル構造を更新することができないためです。接続文字列でDB名を変更すると、新しいテーブル構造の新しいデータベースが問題なく作成されます。この問題に対処する方法がわからないのですか?アプリケーションが近い将来ライブになると、私は適切にモードをさらに変更し、同じ問題が再発し、新しいデータ構造のデータベースを削除して新しいテーブル構造を作り直すことはできません。Startup.csファイルで設定する必要があります。私はまだ役に立つリソースが見つかりませんでした。アドバイスをお願いします。

添付ファイルのスクリーンショットとしてDB初期化プログラムを変更しようとしましたが、実行方法がわかりません。 enter image description here

私は再びプロジェクトコードを確認し、移行が__MigrationHistoryテーブルに適用されていない、移行コードは、実際には、以下のサンプルとして、データベース全体の構造を作成するためのコードを含んでいた:

migrationBuilder.CreateTable(
      name: "Company", 
      columns: table => new 
      { 
       CompanyId = table.Column<int>(nullable: false) 
        .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn), 
       CompanyName = table.Column<string>(maxLength: 100, nullable: false), 
       IsAdmin = table.Column<bool>(nullable: false) 
      }, 
      constraints: table => 
      { 
       table.PrimaryKey("PK_Company", x => x.CompanyId); 
      }); 

そして私の避難所を」プロジェクトの名前空間を変更しました。最近、私はちょうどサイトのユーザー許可テーブル(会社は多くのサイトを持っている)のようないくつかのテーブル関係にいくつかの変更を加えました。私はパーミッションテーブルを追加したので、サイトのパーミッションテーブルは単一のパーミッションタイプの代わりに複数のパーミッションタイプを持つことができます。

Entity Frameworkコアで自動移行を設定する方法がわかりません。 Entity Frameworkのコード最初approchで

+0

変更を会社に転記できますか? – Yaser

+0

私は会社のテーブルに変更を加えていません。最近、私はちょうどサイトのユーザー許可テーブル(会社は多くのサイトを持っています)のような少数のテーブルの関係を少し変更しました。私はパーミッションテーブルを追加したので、サイトのパーミッションテーブルは単一のパーミッションタイプの代わりに複数のパーミッションタイプを持つことができます。 – bearview

答えて

0

、四つの異なるデータベースの初期化戦略があります

  • CreateDatabaseIfNotExists:これはデフォルト初期化子です。 という名前が示すように、 の設定に従ってデータベースが存在しない場合、データベースを作成します。ただし、モデルクラスを変更して、 この初期化子でアプリケーションを実行すると、 例外がスローされます。

  • DropCreateDatabaseIfModelChanges:この初期化は、既存のデータベースをドロップし、あなたのモデルクラス (エンティティクラス)が変更された場合は、新しいデータベースを作成します。したがって、モデルクラスが変更されたときにデータベーススキーマを維持することを心配する必要はありません。

  • DropCreateDatabaseAlways:名前が示すように、この初期化子は関係なく、あなたのモデルクラスが変更されたかどうかのか、既存のデータベースアプリケーションを実行するたびに、 をドロップ。この は、アプリケーションを開発しているときのように、 アプリケーションを実行するたびに、新しいデータベースが必要なときに便利です。

  • カスタムDBイニシャライザ:上記のいずれかが、あなたは 上記の初期化子を使用してデータベースを初期化し、いくつかの他のプロセスをしたい 要件を満たさない場合、またはあなたはまた、独自のカスタム初期化子を作成することができます。あなたがDropCreateDatabaseIfModelChangesやDropCreateDatabaseAlwaysを使用している場合

それではCreateDatabaseIfNotExistsと交換してください。

これを試してください。

+0

こんにちは、返信いただきありがとうございますが、私はすでにCreateDatabaseIfNotExistsと仮定ApplicationDbContext.csファイルで、デフォルトの初期化子を使用して、助言してください。 – bearview

+0

さて、このリンクを試してみてください。http://stackoverflow.com/questions/24169140/there-is-already-an-object-named-aspnetroles-in-the-database –

+0

返事ありがとう、この例は古いものですEFコアを使用しているため、-IgnoreChangesコマンドパラメータはEFコアでは使用できませんが、Entity Frameworkコアで自動移行を設定する方法は不明ですか? – bearview

関連する問題