4

データベース ファースト モデルを使用してコーディングされた SQL データベースを含む既存のアプリケーションがあります (スキーマを変更するたびに EDMX ファイルを作成します)。

EF EDMX ファイルの代わりに EF POCO/DbContext をデータ層として使用するいくつかの追加開発 (元のアプリケーションをサポートする Windows サービス) が行われました。DbContext でイニシャライザ設定が構成されたことはありませんが、DbSet オブジェクトが常にテーブルと一致するため、データベースが変更されることはありませんでした。

ここで、既存のデータベースを使用する別のアプリケーションを作成しましたが、独自の新しいテーブルのみを使用し、EFs 初期化子を使用して作成します。私は、EF Code First を使用してこれらの新しいテーブルを管理する絶好の機会になると考えていました。最初にアプリケーションを実行したときはすべて正常に機能していましたが、現在、元の EF POCO DbContexts (初期化子を使用したことがない) の一部からこのエラーが発生しています。

データベースが作成されてから、'ServerContext' コンテキストをサポートするモデルが変更されました。Code First Migrations を使用してデータベースを更新することを検討してください

調査の結果、EF がそのスキーマのハッシュを SQL サーバーのどこかに保存されているハッシュと比較することがわかりました。この値は、コンテキストが実際にデータベースで初期化子を使用するまで存在しません (私の場合、最新のアプリケーションがテーブルを追加するまで存在しません)。

現在、私の他の DbContexts は、現在存在するハッシュ値を読み取り、それ自体と一致しないため、エラーをスローします。EDMX を使用した EF 接続にエラーはありません。

protected override void OnModelCreating(DbModelBuilder modelBuilder)解決策は、問題が発生しているすべての DbContextsにこの行を入れることだと思われます

Database.SetInitializer<NameOfThisContext>(null);

しかし、後で別のアプリケーションを作成し、最初に EF コードを使用して独自のテーブルを再度作成したい場合、この理論上のさらに新しいコンテキストと現在問題を引き起こしているコンテキストとの間のハッシュを調整することはできません。 .

EF がデータベースに格納するハッシュをクリアする方法はありますか? EF は、現在のコンテキストで DbSet として存在するテーブルのみを変更するほどスマートですか? 任意の洞察をいただければ幸いです。

4

2 に答える 2

4

はい、Bounded DB contexts は実際には良い習慣です。たとえば、基本コンテキスト クラスは、DB への共通接続を使用するために、各サブ クラスは Database.SetInitializer(null); を使用します。あなたが示唆するように。

次に、「DBのビュー」を持つ1つの大きなコンテキストを用意します。このコンテキストはすべての移行を担当し、そのコンテキストのみがそれを行う必要があります。唯一の真実の情報源。

DB の移行を担当する複数のコンテキストを持つことは悪夢であり、解決できるとは思いません。コード ファーストの移行によって作成されたシステム エントリをいじると、涙で終わることしかありません。

あなたが説明したトピックとまったく同じで、ジュリー・ラーマンのビデオで見ました。彼女が提案した解決策は、単一の「移行」コンテキストであり、その後、多くの Bounded DB コンテキストを使用しました。

multiplesight アカウントをお持ちの場合: http://pluralsight.com/training/players/PsodPlayer?author=julie-lerman&name=efarchitecture-m2-boundedcontext&mode=live&clip=11&course=efarchitecture

于 2013-01-14T23:08:08.477 に答える
1

使用している EF のバージョンは何ですか? EF Code First は、SSDL のハッシュをEdmMetadataテーブルに格納するために使用されます。その後、.NET Framework 4.3 で少し変更が加えられ、EdmMetadata テーブルがテーブルに置き換えられました__MigrationsHistory(詳細については、このブログ投稿を参照してください)。しかし、あなたが本当に気にかけているのは、同じデータベースを使用して複数のコンテキストを持つことができるマルチテナント移行であるように思えます。この機能はEF6で導入されました- (現在、Aplpha2 バージョンが公開されています) また、EdmMetadata/__MigrationHistory テーブルは CodeFirst に固有であることに注意してください。デザイナー (Model First/Database First) を使用している場合、追加情報はデータベースに保存されず、EF モデルがデータベースと一致するかどうかはチェックされません。これにより、デバッグが困難なバグやデータの破損が発生する可能性があります。

于 2013-01-14T23:35:01.317 に答える