作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
canonical answer关于放置 Database.SetInitializer
调用的位置在 Global.asax
中用于 Web 项目。我正在寻找另一种选择。
我们使用 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);
}
不过,覆盖默认策略可能涉及通过多个层传递初始化程序。
我们还考虑过创建一个基于反射的初始化程序,它将所有上下文设置为特定策略。
最佳做法是什么?
最佳答案
如何创建一个可以在每个项目的 Global.asax 中实例化的 DBContextBootstrapper 类?它在其实现中为每个上下文设置初始值设定项。
这样,如果您添加一个新的 dbcontext,您只需在 Bootstrap 中进行更改,而不是在每个项目中进行更改。
关于c# - 使用 Database.SetInitializer 避免霰弹枪手术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11460594/
我是一名优秀的程序员,十分优秀!