6

关于在哪里拨打电话的规范答案适用于 Web 项目。我正在寻找另一种选择。Database.SetInitializerGlobal.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);
}

但是,覆盖默认策略可能涉及通过多个层传递初始化程序。

我们还考虑过创建一个基于反射的初始化器,它将所有上下文设置为特定的策略。

最佳做法是什么?

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 回答