我的解决方案中有两个项目:一个ASP.NET MVC Web应用程序项目,每个环境{(1}}(生产/ UAT / dev)和另一个使用EntityFramework数据库的Web项目引用的DAL类库项目首先要处理持久性。目前,DAL类库项目有自己的web.config
,它指定要使用的连接字符串。
对于不同的环境,我需要不同的连接字符串(或者更确切地说,不同的App.Config
)。
我如何将连接字符串移动到Web项目中的data source
并在运行时从DAL项目引用它们?
当前引用连接字符串名称的自动生成的EF web.config
代码是[名称已更改为匿名]:
Model.Context.cs
答案 0 :(得分:3)
您的应用程序只会在运行时读取一个51023\51023231
或app.config
,这将是您启动项目中的一个。
因此,如果您的DAL中有以下内容:
web.config
...并且您将Web应用程序作为启动项目运行,它将从该项目的public EodActivityEntities()
: base("name=DatabaseNameEntities")
{
}
中选择名为DatabaseNameEntities
的连接字符串,忽略其中的内容你的DAL web.config
。所以它已经为你做了。因此,我会说您根本不需要在DAL的app.config
文件中添加连接字符串。
现在,对于不同的环境,您需要不同的连接字符串。为您的环境创建新的解决方案配置DEV,UAT& LIVE,你可以使用app.config
转换(info here和here),它将使用正确的连接字符串进行构建。
答案 1 :(得分:1)
我建议在上下文的构造函数中传递连接字符串。 EF创建的基础构造函数接受一个字符串,可以是配置文件中的命名值,也可以是连接字符串本身。
然后将每个环境的连接字符串移动到MVC项目,在该项目中可以使用web.config
var connectionString = WebConfigurationManager.AppSettings["connection"];
var context = new EodActivityEntities(connectionString);
Coulton是正确的,因为只会加载一个配置文件,解决方案可能是将连接字符串命名为相同,以便在运行应用程序时加载web.config。但是,这会扩展您的配置,而不是将其推送到应用程序的上下文根。
答案 2 :(得分:1)
当您从Web项目引用DAL项目时,构建的Web项目时,构建的DAL.dll应自动复制到Web项目的/ bin文件夹中。首先,检查确实发生了。如果没有,请查看Web项目参考,在列表中找到您的DAL项目并查看属性。 CopyLocal应设置为True。
当您的Web项目正在运行时,您的DAL对来自DAL的app.config的设置所做的任何引用都将来自您的Web应用程序的web.config,作为DAL将在Web应用程序的上下文中运行。
所以你是对的,你需要在web.config中添加设置。 对不同环境使用不同值的最佳方法是使用web.config转换。在Web应用程序中,您可能已经有几个这样的子解决方案文件位于web.config(web.debug.config& web.release.config)下。 Visual Studio将在发布时应用这些转换。我们通常有每个环境的发布配置文件和每个环境的匹配转换文件,但只有一个实际的web.config文件包含所有默认(未转换)设置。
您没有提到您正在使用的Visual Studio版本,但本文可能会帮助您: http://www.asp.net/mvc/overview/deployment/visual-studio-web-deployment/web-config-transformations