在数据访问项目中使用 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(每个生成包含相关转换)传递到数据访问项目的正确方法是什么?

在数据访问项目中使用 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>

使用您自己的数据更改大写字母