在数据访问项目中使用web.config连接字符串

时间:2016-07-11 18:40:42

标签: c# sql-server entity-framework

我在.NET 4.6.1,Visual Studio 2015,SQL Server Developer 2016上。我想在我的主项目的web.config中指定我的EF连接字符串,但我不能为我的生活弄清楚如何在我的数据访问项目中引用它。我能找到的每个答案都说与this one中的答案相同 - 也就是说,使用它:

System.Configuration.ConfigurationManager
    .ConnectionStrings["connectionStringName"].ConnectionString;

但是,当我使用它时,没有传递有效的连接字符串。而是获得一个看似默认的;当我没有在任何地方定义的字符串时,数据源被设置为.\SQLEXPRESS。搜索解决方案中SQLEXPRESS的所有文件都不会返回任何结果,因此它不会在任何地方进行硬编码。

将连接字符串从我的主web.config(每个版本的相关转换)传递到我的数据访问项目的正确方法是什么?

6 个答案:

答案 0 :(得分:4)

只有一个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.configapp.config的{​​{1}}的入口点。

对于Entity Framework的.exe,您可以将连接字符串的名称直接传递给构造函数。您不必检索连接字符串并自行传递。因此,请在web.config中为每个连接指定一个特定的唯一名称。

DbContext

然后在您的代码中,您可以使用该名称创建Entity Framework的DbContext。

<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>

在我以前的项目中,我工作的var myEntities = new MyEntities("ConnectionName1"); // MyEntities is some class that derives from DbContext 通常总是在运行时映射到一个数据库。我的意思是我不会多次使用相同的DbContext类型指向不同的数据库。在这种情况下,我将该名称硬编码到我的DbContext类型中,并确保我的消费应用程序分别在web.config或app.config中列出了该连接名称。

DbContext

或者,如果您确实需要完整的连接元素,则可以引用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

我暂时没有使用过这种方法,但也许有充分的理由在你的情况下使用它。

答案 1 :(得分:1)

  

当我没有在任何地方定义的字符串时,数据源被设置为。\ SQLEXPRESS。搜索SQLEXPRESS解决方案中的所有文件都不会返回任何结果,因此它不会在任何地方进行硬编码。

在您的机器配置文件中进行硬编码。只需添加:

<clear />

在您的第一个连接字符串上方将其删除。

您可以从machine.config中的第126行删除。\ SQLExpress连接字符串,但是恕我直言,安全方面播放并且不要乱用机器配置,而是更喜欢使用<clear />

答案 2 :(得分:0)

您是否尝试过连接到服务器资源管理器 - &gt;数据连接并自动生成属性?接下来我要尝试的是添加一个ADO.Net数据模型并使用Access驱动程序指向正确的数据库。它可能与配置字符串上的提供程序一样简单。

答案 3 :(得分:0)

以下是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

答案 4 :(得分:0)

据我记忆,当使用EF时,它会创建一个与您定义的上下文名称相匹配的连接字符串,因此,如果您的上下文被命名为MyContext,那么您应该定义一个具有该名称的连接字符串在app/web.config中。为了省去自己编写EF连接字符串的麻烦(比常规ADO.Net连接字符串长得多),只需复制在DLL .config文件中生成的那个。

完成后,您可以使用Web项目中内置的配置转换功能,允许您根据当前的构建配置更改.config文件的部分内容,例如:

  • web.config - 将保留DEVELOPMENT连接字符串。
  • web.staging.config - 将使用STAGING连接字符串进行replace转换。
  • web.release.config - 将使用RELEASE连接字符串进行replace转换。

希望它有所帮助!

答案 5 :(得分:0)

 <configuration>
    <connectionStrings>
      <add name="CONNECTIONSTRINGNAME" connectionString="server=.; Database=YOURDATABASENAME;Integrated Security=true;" providerName="System.Data.SqlClient"/>
    </connectionStrings>
 </configuration>

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