在数据访问项目中使用 web.config 连接字符串
本文关键字:web config 连接 字符串 数据 访问 项目 | 更新日期: 2023-09-27 17:56:18
I'm on .NET 4.6.1, Visual Studio 2015, SQL Server Developer 2016.我想在主项目的 web.config 中指定我的 EF 连接字符串,但我一生都无法弄清楚如何在数据访问项目中引用它。我能找到的每个答案都说要做与这个答案相同的操作 - 也就是说,使用这个:
System.Configuration.ConfigurationManager
.ConnectionStrings["connectionStringName"].ConnectionString;
但是,当我使用它时,不会传递有效的连接字符串。相反,它得到一个似乎是默认值的;数据源设置为.'SQLEXPRESS
,当我没有在任何地方定义字符串时。在解决方案中的所有文件中搜索SQLEXPRESS
不会返回任何结果,因此不会在任何地方进行硬编码。
连接字符串从主 web.config(每个生成包含相关转换)传递到数据访问项目的正确方法是什么?
只有一个 app.config/web.config 将在运行时读取,这是与应用程序入口点关联的配置。因此,如果您有一个 Web 项目和一个在数据访问层提供服务的引用项目,并且您希望从配置中读取连接字符串,则使用 Web 项目的 web.config。对于 Windows 应用程序或 wpf 等也是如此,只会使用应用程序主入口点的配置。应用程序运行后,您可以从代码中的任何位置引用该 app.config/web.config,但您通常使用字符串标识符执行此操作。
换句话说,如果您有一个将数据访问编译为MyDA.dll
的项目,并且该项目中的 app.config 可能会输出到 MyDA.dll.config
(默认情况下不会发生这种情况),则您在MyDA.dll.config
中的任何内容都将在运行时被忽略。不会从中读取文件,只会使用web.config
或.exe
入口点的app.config
。
对于实体框架的DbContext
可以将连接字符串的名称直接传递给构造函数。您不必检索连接字符串并自行传递它。因此,请在 web.config 中为每个连接指定一个特定的唯一名称。
<connectionStrings>
<add name="ConnectionName1" connectionString="Data Source=(local);Database=YourDB;User Id=YourUser;Password=yourPassword" providerName="System.Data.SqlClient" />
<add name="ConnectionName2" connectionString="Data Source=(local);Database=YourDB2;User Id=YourUser2;Password=yourPassword2" providerName="System.Data.SqlClient" />
<!-- more here -->
</connectionStrings>
然后在代码中,可以使用该名称创建实体框架的 DbContext。
var myEntities = new MyEntities("ConnectionName1"); // MyEntities is some class that derives from DbContext
在我过去的项目中,我使用DbContext
通常总是在运行时映射到一个数据库。我的意思是,我不会多次使用相同的 DbContext 类型指向不同的数据库。在这种情况下,我将该名称直接硬编码到我的DbContext
类型中,并确保我的使用应用程序分别在 web.config 或 app.config 中列出了该连接名称。
public class MyEntities : DbContext {
public MyEntities() : base("ConnectionName1") {}
}
// calling code now never has to know about the connection
using(var myEntities = new MyEntities()) { /* do something here */}
或者,如果您确实想要完整的连接元素,则可以引用System.Configuration
(将其添加到进行以下调用的项目中的项目引用中)并以这种方式调用它。
var connection = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionName1"];
var conString = connection.ConnectionString; // you can also get the provider
var myEntities = new MyEntities(conString);
我已经有一段时间没有使用这种方法了,但也许有充分的理由在您的情况下使用它。
数据源被设置为 .''SQLEXPRESS,当我在任何地方都没有定义该字符串时。在 SQLEXPRESS 的解决方案中搜索所有文件不会返回任何结果,因此不会在任何地方对其进行硬编码。
它在您的计算机配置文件中硬编码。只需添加:
<clear />
在第一个连接字符串上方将其删除。
您可以从 machine.config 中的第 126 行中删除 .''SQLExpress 连接字符串,但是恕我直言,为了安全起见,不要弄乱机器配置,更喜欢使用 <clear />
代替。
尝试过连接到服务器资源管理器 ->数据连接并自动生成属性?接下来我会尝试添加一个 ADO.Net 数据模型,并使用 Access 驱动程序指向正确的数据库。它可能像配置字符串上的提供程序一样简单。
以下是MSDN给出的简化示例和/或正确方法:
var connectionString = ConfigurationManager.ConnectionStrings["connectionStringName"].ConnectionString;
配置文件如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<connectionStrings>
<add name="connectionStringName" connectionString="Data Source=(LocalDB)'v11.0;Initial Catalog=DatabaseName;Integrated Security=True;Pooling=False" />
</connectionStrings>
</configuration>
所需的命名空间:
System.Configuration
发件人:https://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.connectionstrings(v=vs.110).aspx
据我所知,使用 EF 时,它会创建一个与您定义的上下文名称匹配的连接字符串,因此,如果您的上下文名为 MyContext
,则应在 app/web.config
中定义具有该名称的连接字符串。若要省去自行编写 EF 连接字符串(比常规ADO.Net
连接字符串长得多)的麻烦,只需复制在 DLL .config
文件中生成的字符串。
完成此操作后,您可以使用内置于 Web 项目中的配置转换功能,该功能允许您根据当前构建配置更改.config
文件的某些部分,例如:
- web.config - 将保存开发连接字符串。
- web.staging.config - 将使用暂存连接字符串保存
replace
转换。 - web.release.config - 将使用 RELEASE 连接字符串保存
replace
转换。
希望对您有所帮助!
<configuration>
<connectionStrings>
<add name="CONNECTIONSTRINGNAME" connectionString="server=.; Database=YOURDATABASENAME;Integrated Security=true;" providerName="System.Data.SqlClient"/>
</connectionStrings>
</configuration>
使用您自己的数据更改大写字母