gpt4 book ai didi

c# - 使用 Database.SetInitializer 避免霰弹枪手术

转载 作者:太空狗 更新时间:2023-10-29 21:23:43 26 4
gpt4 key购买 nike

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com