14

伝統的に、私は常に手動で sql スクリプトを書いてきたので、それらはきれいでクリーン (私は生成されたスクリプトのファンではありません) であり、リリースごとにリリースされます。新しいインストール スクリプトと、新しいテーブル、既存のテーブルの変更など。これはすべて非常に標準的です。

最初に EF 4 コードをいじる時間はあまりありませんでしたが、実稼働環境で実際に実行可能であれば、それを使用することに非常に興味があります。

データベースが存在しない場合にデータベースが自動的に作成されるコードファーストのアプローチがあるとします。スキーマ/モデルが変更された新しいバージョンのソフトウェアをリリースするとどうなりますか。EF は、更新された EF モデルに一致するようにデータベース スキーマを更新するほどスマートですか?

シナリオ

  1. クライアントは、サーバーに asp.net MVC Web サイトをインストールします。最初の実行時に、新しいデータベースが作成されます
  2. クライアントがウェブサイトをしばらく使用すると、データベースにデータが入力されます
  3. 一方、Web サイトの新しいバージョンがリリースされ、EF モデルが変更されました
  4. クライアントは新しいバージョンをダウンロードし、Web サイトを展開し、既存のデータベースを参照します

コード ファーストは初期展開にのみ役立つのでしょうか、それとも既存のデータベース リリースをこのようにリリースするように更新するほどスマートでしょうか?

4

5 に答える 5

6

EF CTP4 の時点で、オブジェクト モデルを変更するたびにデータベースが削除され、再作成されます (これは既定の規則ではなく、データベース初期化戦略を設定して、明示的に EF Code-First にそうするように指示する必要があります)。

そうは言っても、EF チームは、シナリオに正確に対応するデータベースの進化 (別名移行) ソリューションに積極的に取り組んでいます。オブジェクト モデルが時間の経過とともに変化するにつれて、データベース スキーマを進化させ、基本的にデータベースを変更して元に戻そうとするソリューションです。モデルを再作成するのではなく、モデルと同期します。

EF チームによると、この機能は、2011 年の第 1 四半期にリリースされる予定の EF の次のバージョンの一部として利用できるようになります。

于 2010-11-18T03:28:05.063 に答える
2

データベースを作成する機能は、Code First の機能の1 つに過ぎず、オプションの機能です。この機能を使用する必要はまったくありません。実際、Scott Gu は、既存のデータベースで Code Firstを使用することに特化したブログ投稿全体を持っています。

データベース移行がリリースされるまでは、別の戦略を考え出す必要があります。その戦略は、従来のように ALTER TABLE スクリプトを管理するだけです。したがって、新しいバージョンをデプロイするときは、ALTER スクリプトを実行し、モデルへの変更を含むコードをデプロイします。

とはいえ、Code First には、毎回データベースを単純に削除して再作成するよりも多くのオプションがあります (これは 1 つのオプションにすぎません)。モデルが変更された場合にのみデータベースを再作成するように初期化子を設定することもできます。イニシャライザをまったく実行しないように設定することもできます (データベースへの変更を手動で管理している場合)。この投稿では、EF データベース初期化子について詳しく説明します。

于 2010-11-18T04:24:18.303 に答える
0

モデルとデータベーススキーマが同期していない場合にウェブマスターに通知するデータベースコンテキストイニシャライザーに取り組んでいます。これは、コード ファースト モデルとデータベース スキーマの両方を完全に制御したい開発者にとって便利です。見てみな:

https://github.com/rialib/efextensions

于 2011-03-03T01:10:44.410 に答える
0

数か月が経過し、公式の回答がリリースされました: IDatabaseInitializer .

多かれ少なかれ探しているものは次のとおりです。

public class DoNothingWithMyDatabase<TContext> : IDatabaseInitializer<TContext>
    where TContext : DbContext
{
    public void InitializeDatabase(TContext context)
    {
    }
}

ここから取得: http://blog.cincura.net/231783-ultimate-efv4-ctp4-code-first-full-mapping-example-using-firebird/

これで、慣れ親しんだ方法でスキーマを変換できます。もちろん、SQL の代わりに C# を使用する、より複雑な DatabaseInitializer を記述して、変更を実行する前に変更が必要かどうかを確認したり、テーブルが変更されたときにデータを変換したりするなど、より複雑なことを行うこともできます。

テーブルの変更の詳細の一部を扱う別の StackOverflow の質問: Entity Framework Code First fluent API setting field properties in a for loop

于 2011-05-08T02:27:14.510 に答える
0

EF 6 を使用すると、データベースを再設計 (コードファースト) して、すべての更新プログラムがインストールされていることを確認できます。既存のデータベースに異なるスキーマがあり、コンテキスト クラスでそれらを使用できる場合があります。

 modelBuilder.Entity<Charge>().ToTable("FullDepot.Charge");

dbo.yourtableあなたがそうしないと、EFはピックアップするだけで、テーブルFullDepot.secondtableなどはピックアップしません

于 2015-07-16T06:53:05.740 に答える