どこに電話をかけるかについての標準的な答えは、Webプロジェクトにあります。別のオプションを探しています。Database.SetInitializer
Global.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);
}
ただし、デフォルトの戦略をオーバーライドするには、初期化子を複数のレイヤーに渡す必要があります。
また、すべてのコンテキストを特定の戦略に設定するリフレクションベースの初期化子を作成することも検討しました。
ベストプラクティスは何ですか?