6

どこに電話をかけるかについての標準的な答えは、Webプロジェクトにあります。別のオプションを探しています。Database.SetInitializerGlobal.asax

コードファーストでEntityFramework4.3.1を使用しています。WebサービスとWinFormsアプリケーションを作成し、通常、データアクセスコード(DbContextsなど)を共有ライブラリに配置します。

現在、DbContextの子孫のコンストラクターは次のようになっています。

public PricingContext(string connectionString)
    : base(connectionString)
{
    Database.SetInitializer<PricingContext>(null);
}

95%の場合、これが正しいデフォルトです。5%の時間(一部の統合テスト、グリーンフィールド開発など)はそうではありません。

そのコードをサービスとアプリケーションの初期化(または構成)に移動する場合、ライブラリに新しいDbContextを追加するには、ShotgunSurgeryが必要です。ライブラリがコンテキストを直接公開していない場合でも、これらのプロジェクトはすべて更新する必要があります。

オプションの引数は1つの可能性です:

public PricingContext(string connectionString,
    IDatabaseInitializer<PricingContext> databaseInitializer = null)
    : base(connectionString)
{
    Database.SetInitializer<PricingContext>(databaseInitializer);
}

ただし、デフォルトの戦略をオーバーライドするには、初期化子を複数のレイヤーに渡す必要があります。

また、すべてのコンテキストを特定の戦略に設定するリフレクションベースの初期化子を作成することも検討しました。

ベストプラクティスは何ですか?

4

2 に答える 2

6

すべてのプロジェクトのGlobal.asaxでインスタンス化できるDBContextBootstrapperクラスを作成するのはどうですか。これは、その実装ですべてのコンテキストの初期化子を設定します。

このように、新しいdbcontextを追加する場合は、すべてのプロジェクトではなく、ブートストラッパーでのみ変更を加える必要があります。

于 2012-07-12T21:08:24.700 に答える
2

EF 4.3(およびそれ以降)には、構成ファイルから初期化子を定義する可能性も含まれているため、コードで初期化子を設定する必要はありませんが、複数の構成を維持する必要があります。

@Hasanのアドバイスはあなたにとって最良の解決策のように見えます。

于 2012-07-13T09:04:32.163 に答える