問題タブ [entity-framework-migrations]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
azure - SQL Azure の予期しないデータベースの削除/再作成
私はこれについて何時間も頭を悩ませてきましたが、何が悪いのか理解できないようです.
プロジェクトの基本設定は次のとおりです。
- ASP.NET メンバーシップを使用した MVC 3.0 プロジェクト
- Entity Framework 4.3、Code First アプローチ
- ローカル環境: 2 つの MDF データベース ファイルが接続されたローカル SQL Server (aspnet.mdf + entities.mdf)
- サーバー環境: Windows Azure + 2 つの SQL Azure データベース (aspnet とエンティティ)
行ったことは次のとおりです。
- ローカル データベースとリモート データベースを作成し、デバッグ モードで SQLEXPRESS 接続文字列を使用し、リリース モードで SQL Azure 接続文字列を使用するように web.config を変更しました。
- データをシードするメソッドで
SampleData
拡張するクラスを作成しました。DropCreateDatabaseAlways<Entities>
Seed
- データベースにデータをシードするために使用
System.Data.Entity.Database.SetInitializer(new Models.SampleData());
されます。Application_Start
- アプリをローカルで実行しました-テーブルが作成され、シードされました。すべて問題ありません。
- リモートアプリをデプロイして実行しました-テーブルが作成され、シードされました。すべて問題ありません。
リモート Azure 環境でアプリケーションを起動するたびにエンティティ データベースの破棄を停止するプリプロセッサ ディレクティブを追加しました。
/li>
ここが醜くなったところです
- NuGet を使用して移行を有効にしました。
AutomaticMigrationsEnabled = true;
- すべてがスムーズで快適に動作していました。数日間調理したままにしました
本日、Azure 環境に未知のバグがあることに気付きました。
- スーパークラスから派生したいくつかのクラスがあります
SuperClass
- 対応するエンティティ テーブルは、これらすべてのオブジェクトを同じ
SuperClass
テーブルに格納し、さまざまなクラスをロードするときにどの列からフィードするかを識別するために識別子を使用します。 ロードは今日までは問題なく行われていましたが、今はそうではありません。次のエラー メッセージが表示されます。
/li>- 簡単なチェックの後、
SuperClass
テーブルには列Foo
とがありますFoo1
。SuperClass
には 2 つのサブクラスSubClass1
とがありSubClass2
、それぞれにFoo
プロパティがあるため、十分に論理的です。私たちの場合Foo
は NULL ですFoo1
が、int32
値があります。したがって、問題はデータベースにあるのではなく、モデルとデータベースの間のリンクが失われたように見えます。ディスクリミネーターのロジックが破損しています。
- スーパークラスから派生したいくつかのクラスがあります
何がうまくいかなかったのかについての兆候を見つけようとして、いくつかのことに気付きました。
- SQL Azure Entity データベースで移行を実行したことはありませんが、データベースには現在
_MigrationHistory
テーブルがあります
/li>_MigrationHistory
テーブルには 1 つのレコードがあります。他のテーブルを見ると、この移行が行われたときにそれらのほとんどが空になっていました。最初にシードされたテーブルのみが
SampleData
そのまま残りました。- SQL Azure 管理ポータルでチェックインすると、エンティティ データベースは次の作成日を示しています: 2012 年 4 月 10 日 23:50:55。
- SQL Azure Entity データベースで移行を実行したことはありませんが、データベースには現在
ここに私たちの理解があります
- 何らかの理由で、SQL Azure によってデータベースが削除され、再作成されました
- このプロセスで _MigrationHistory テーブルが作成され、将来の移行のためにモデルをテストするための開始点が登録されました。
ここに私たちの質問があります
- 誰が / 何がデータベースの削除 / 再作成を引き起こしたのですか?
Application_Start
EF はサンプル データをどのように再シードできSystem.Data.Entity.Database.SetInitializer<Entities>(null);
ますか?
編集:何が問題なのかを調べたところ、この SQL AzureチュートリアルPersistSecurityInfo
で考慮しなかったことが 1 つあります。それは、データベースの作成後に SQL Azure エンティティ データベース接続文字列から削除しなかったことです。なぜ地球上でそれが問題を引き起こしたのかわかりませんが、それでも言及する価値があります...
asp.net-mvc - 外部キー制約、子オブジェクトのコレクションを伴うEF
モデルを更新しようとしていますが、「操作に失敗しました。1つ以上の外部キープロパティがnull不可であるため、関係を変更できませんでした。関係に変更が加えられると、関連する外部キープロパティがnull値に設定されている外部キーがnull値をサポートしていない場合は、新しい関係を定義するか、外部キープロパティに別の非null値を割り当てるか、無関係のオブジェクトを削除する必要があります。」
私が理解していることから、1つ以上の外部キープロパティがnull許容でないため、関係を変更できませんでした。問題は、EntityFrameworkが仮想ICollectionを処理する方法にある可能性があります。
ただし、スキャフォールドリポジトリパターンを使用するときにソリューションを実装する方法がよくわかりません。Save()メソッドParentObjectRepositoryクラスを編集する必要がありますか?
実は、EFにこれを理解させる方法があるに違いないと思います。EFチームが「おそらく誰も外部キー制約のあるオブジェクトのコレクションを使用していないので、それをサポートできない」と考えていたのかわかりません。
追加されたコードを更新
その他のコード:
Save()メソッドは、上記のクラスのスキャフォールドであるMagnetEventRepositoryからのものです。
別の更新 では、AttendeeInformationFieldのMagnetEventIdをnull許容整数に変更することでエラーを正常に削除しました。データベースを調べると、何が悪いのかが正確にわかります。
値が「E-mail」のAttendeeInformationFieldが1つあるとします。私がMagnetEventを編集すると、AttendeeInformationFieldはMagnetEventIdをnullに更新してから、正しいMagnetEventIdとValueで新しい投稿を追加します。
代わりに、AttendeeInformationFieldの投稿が更新された方がいいと思います。
.net - 異なるTFSブランチで作業しているときに、EFコードの最初の移行を失いますか?
TFSを使用しており、開発者用にさまざまなブランチがあります。
ブランチAでは、列サイズを変更するために移行を行いました
ブランチBでは、新しいテーブルを追加するために移行を行いました。このブランチはブランチAの変更について知りません!!
両方の変更がメインブランチにマージされます。
データベースの更新を行うと、2つの移行が行われますが、最後に保留中の変更があることが通知されます。Add-Migrationを実行すると、最初の移行(ブランチA)と同じものが作成されます。
保留中の変更があり、自動移行が無効になっているため、現在のモデルに一致するようにデータベースを更新できません。保留中のモデル変更をコードベースの移行に書き込むか、自動移行を有効にします。自動移行を有効にするには、DbMigrationsConfiguration.AutomaticMigrationsEnabledをtrueに設定します。Add-Migrationコマンドを使用して、保留中のモデル変更をコードベースの移行に書き込むことができます。
最初の移行について知らなかったため、前回の移行のプロパティTarget de IMigrationMetadataのコンテンツに何かが欠落しているためですか?
異なるTFSブランチで移行を処理することは可能ですか?
c# - 複数のテーブルの複数の列をダウングレード/アップグレードする方法
以下のコマンドを使用して、データベースの最近の変更をアップグレード/ダウングレードできます
アップグレードの場合: 以下のコマンドを使用するパッケージ マネージャー コンソールで
ダウングレードの場合: 以下のコマンドを使用するパッケージ マネージャー コンソールで
複数のテーブルの複数の列をアップグレード/ダウングレードする方法を教えてください。
entity-framework-4 - エンティティ フレームワークの移行を使用したプロジェクトのシードと分岐
私は移行を使用してエンティティ フレームワーク コードの最初の 4.3 を使用してプロジェクトに取り組んでいます。ローカルで実行する場合、web.config はCreateDatabaseIfNotExists<DataContext>
、開発データベースにテスト データをシードするだけでなく、最初の実行時にさまざまな「静的」ルックアップ テーブル データを設定するデータベース イニシャライザーをターゲットにするように構成されます。
開発データベースが作成されると、データベースへのその後の変更は、プロジェクトに移行を追加し、'updata-database' PS コマンドでデータベースを更新することで完了します。
プロジェクトに満足したら、webdeploy を使用してコードをデプロイしますが、webdeploy には移行テーブルが含まれていないため、データベースを手動でコピーします。展開するときは、web.config 変換を使用して、.xml を実装する新しいデータベース初期化子を設定しますMigrateDatabaseToLatestVersion<DataContext>
。これにより、後でデプロイされた新しいコードベースの移行が適用されます。これはすべてうまく機能していますが、これがテスト データだけでなく、アプリケーションの実行に必要なデータを使用してデータベースを初期化するための最良の方法であるかどうかについて懸念があります。私が探しているのは、最初のシード データを作成するのに良い方法CreateDatabaseIfNotExists<DataContext>
です。構成クラスにシード メソッドがあることは認識していますが、移行のたびにデータベースを更新しているため、これは望ましい解決策ではありません。
プロジェクトはTFSにあり、時々、このプロジェクトの新しいブランチを作成する必要があります。これは本質的に最初のクローンです。これを初めてローカルで実行するとき、データベースはまだ存在しませんが、前述のように作成およびシードされます。現在の最大の問題は、以前に移行によって処理されたスキーマの変更が、データベースが初めて作成されたときに適用されるようになったことです。次に、新しい移行ファイルを追加して「update-database」を実行しようとすると、データベースの作成時に変更が既に適用されているため、以前の移行を実行できないため、壁にぶつかります。ここで何か間違ったことをしている、または単にトリックを逃したとしか想像できません。
結論として、私はに関する情報を探しています
- 移行を使用して初めてデータベースを作成するときに、初期テスト データと必要なアプリケーション データをシードする最良の方法。
- コードの移行を含むプロジェクトを分岐し、初めてデータベースを作成する必要がある場合の問題を解決する最善の方法。
読んでくれてありがとう。
entity-framework-4 - Entity Framework 4.3.1 Code First: データベースは作成されましたが、テーブルは作成されませんでした
今日、古いアプリケーションを EF 4.2 から EF 4.3.1 に移行しました。私のアプリでは CodeFirst を使用していましたが、移行後に機能しなくなり、その理由を見つけることができませんでした。その他の考えられる問題を解決するために、小さなコンソール アプリケーションを作成することにし、ADO チームによって公開されたデータ移行ウォークスルーを使用しました。
http://blogs.msdn.com/b/adonet/archive/2012/02/09/ef-4-3-code-based-migrations-walkthrough.aspx
ブログのコードを正確にコピーしましたが、正しく動作する代わりに (DB の作成、スキーマの作成、およびブログの挿入)、いくつかのエラーが発生します。
- DB のみが作成され、テーブルは作成されません
- このエラーが発生します
Conversion failed when converting datetime from character string.
」
これらはすべて SQL Server 2005 Express 上にあります。
SQL Compact を使用して同じことを試しましたが、同じ結果 (別のエラー):
- DB のみが作成され (この場合は bin フォルダー内の sdf ファイル)、テーブルは作成されません
- エラーが発生します
The format of the specified date or time datepart is not valid. [ String = 2012-04-19T13.21.04.364 ]
どちらの場合も、EF が最初の移行として入力したい行に問題があると思います。
どうやら . 少なくとも私のロケールでは、次のようにする必要があります。
これはバグですか?以前は常に他の日時で機能していました。
更新 明示的な移行として実行し、-verbose フラグを設定して移行を適用しようとしましたが、次のようになります。
Update 2 SQL Server Profiler をインストールし、そこで何が起こっているかをプロファイリングしました。クエリ アナライザーを使用してすべてのステートメントを 1 つずつ実行しましたが、失敗したのは、既に述べたように、移行の挿入です。
datatime 文字列の形式を から2012-04-23T14.16.59.038Z
コマンド2012-04-23T14:16:59.038Z
に変更すると、EF がロケールと互換性のない形式で datatime を送信していると思います。
ありがとうシモーネ
c# - EF 4.3 で複雑なキーを使用して AddOrUpdate でデータをシードする方法
テストデータを使用して開発データベースをシードしようとしています。
私はcontext.People.AddOrUpdate(p => p.Id, people));
多くの成功を収めて使用しました。
主キーがわからない別のテーブルをシードする必要があります。
たとえば、姓と名の一致に基づいて AddOrUpdate を実行したいと思います。
Expression を正しく記述する方法がわかりません。
明らかに間違っていますが、私が探している解決策を伝えてくれることを願っています.
database-migration - EF 4.3データベースの移行-エラーを無視する方法はありますか?
手動移行を実行するときにエラーを無視する方法はありますか?
さまざまな状態のクライアントデータベースがあり、それらをすべて最新バージョンに更新する必要があります。
エラーを無視することについて質問する理由は、移行を次のようにコーディングしたいからです。
ただし、当然のことながら、予想どおり、列がすでに存在する場合は例外がスローされます。
entity-framework - MVC3とコードファーストの移行-「データベースが作成されてから、「blah」コンテキストをサポートするモデルが変更されました」
私は、Entity FrameworkCodeFirstを使用してプロジェクトを開始しました。準備ができたら、データベースとコードをホストプロバイダーにアップロードしました。すべてがうまくいった。
クラスの1つに新しいフィールドを追加する必要があり、データベースのデータを失いたくありません。したがって、CodeFirstMigrationsの使用に関するいくつかのブログ投稿をフォローしてみました。私は次のことをしました:
- リモート(本番)データベースをバックアップしました。
- このデータベースをローカルに添付しました
- クラスにプロパティを追加しました
- PM>有効-移行
- PM> Add-Migration AddSortOrderToCar
- PM>更新-データベース
- この時点で、ローカルデータベースの.bakファイルを作成し、そのファイルを使用してリモートデータベースに「復元」しました。
- 最後に、コードをリモートサイトに公開しました。
サイトにアクセスすると、次のエラーメッセージが表示されます。データベースが作成されてから、「blahblah」コンテキストをサポートするモデルが変更されました。CodeFirstMigrationsを使用してデータベースを更新することを検討してください。
私は何が間違っているのですか?
entity-framework - EF CodeFirst - データベースの作成後にインデックスを作成する
プロジェクトをデータベース ファーストからコード ファーストに移行しています。
Entity Framework は、新しいデータベース (古いデータベースを模倣する必要があります) を作成するための優れた作業を行います。
テーブルを記述するために、データ注釈と流暢な API を組み合わせて使用しています。
私のデータベースにはいくつかのインデックスがあり、Entity Framework でそれらも作成したいと考えています。これを行う古い方法は、独自の初期化子を定義し、カスタム T-SQL を使用することです。
しかし、今では EF 移行が用意されているので、これを行うのがより簡単になるはずです。
CreateDatabaseIfNotExists<> を自動移行と組み合わせてインデックスを作成する方法がわかりません。MigrateDatabaseToLatestVersion<,> を使用しようとしましたが、データベースが作成された後に移行を実行していないようです。
Entity Framework 4.3 になった今、データベース作成時にインデックスと制約を作成する適切な方法は何ですか?