关于在哪里拨打电话的规范答案适用于 Web 项目。我正在寻找另一种选择。Database.SetInitializer
Global.asax
我们将 Entity Framework 4.3.1 与 Code First 结合使用。我们编写 Web 服务和 WinForms 应用程序,并且通常将数据访问代码(例如 DbContexts)放在共享库中。
目前,我们的 DbContext 后代的构造函数如下所示:
public PricingContext(string connectionString)
: base(connectionString)
{
Database.SetInitializer<PricingContext>(null);
}
95% 的情况下,这是正确的默认值。5% 的时间(一些集成测试、新建开发等)不是。
如果我们将该代码移动到我们的服务和应用程序的初始化(或配置)中,则将新的 DbContext 添加到库中涉及到Shotgun Surgery。所有这些项目都必须更新,即使库没有直接公开上下文。
可选参数是一种可能性:
public PricingContext(string connectionString,
IDatabaseInitializer<PricingContext> databaseInitializer = null)
: base(connectionString)
{
Database.SetInitializer<PricingContext>(databaseInitializer);
}
但是,覆盖默认策略可能涉及通过多个层传递初始化程序。
我们还考虑过创建一个基于反射的初始化器,它将所有上下文设置为特定的策略。
最佳做法是什么?