我使用的是EF 6.1 Code First。我在运行时以编程方式配置连接字符串,如:
myContext.Database.Connection.ConnectionString = "Data Source=(localdb)\v11.0;Initial Catalog=MyDb;Integrated Security=True;"
这样可以正常工作,但前提是我在app / web.config中保留了一些样板连接信息:
<connectionStrings>
<add name="MyDb" connectionString="Data Source=NOTUSED;Initial Catalog=NOTUSED;" providerName="System.Data.SqlClient" />
</connectionStrings>
我怀疑这是因为我没有提供提供商信息。我正在指定provider和defaultConnectionFactory部分(SQL Server / LocalDbConnectionFactory),但它似乎并不关心:
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="v11.0" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
如果我删除了连接字符串部分,它会尝试附加到一个不存在的mdf文件:
System.Data.SqlClient.SqlException:无法附加文件&#39; C:\ My 项目\ App_Data文件\ MyDb.mdf&#39;作为数据库MyDb。
通常,localdb连接字符串会生成到c:\ users \ my_user \ MyDb.mdf的路径。因此,除非我的.config文件中有连接字符串部分,否则它似乎没有使用LocalDb工厂。
如何在每个上下文中指定EF从该连接字符串节点获取的providerName信息?或者我在这里咆哮错误的树?
答案 0 :(得分:2)
这可能与您构建连接的方式有关。如果您在DataContext上使用默认构造函数,那么它将尝试从配置文件中找到您的连接字符串:
MyDbContext myContext = new MyDbContext() <- this uses the default constructor
myContext.Database.Connection.ConnectionString = "_conn_str_"
如果在构造函数中传递连接字符串,则不需要配置文件条目:
using (MyDbContext myContext = new MyDbContext("_conn_str_")) {
// the above line should not need an entry in the config file
}
希望这有帮助。