我在.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(每个版本的相关转换)传递到我的数据访问项目的正确方法是什么?
答案 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.config
或app.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
答案 4 :(得分:0)
据我记忆,当使用EF时,它会创建一个与您定义的上下文名称相匹配的连接字符串,因此,如果您的上下文被命名为MyContext
,那么您应该定义一个具有该名称的连接字符串在app/web.config
中。为了省去自己编写EF连接字符串的麻烦(比常规ADO.Net
连接字符串长得多),只需复制在DLL .config
文件中生成的那个。
完成后,您可以使用Web项目中内置的配置转换功能,允许您根据当前的构建配置更改.config
文件的部分内容,例如:
replace
转换。replace
转换。希望它有所帮助!
答案 5 :(得分:0)
<configuration>
<connectionStrings>
<add name="CONNECTIONSTRINGNAME" connectionString="server=.; Database=YOURDATABASENAME;Integrated Security=true;" providerName="System.Data.SqlClient"/>
</connectionStrings>
</configuration>
使用您自己的数据更改大写字母