实体框架提供程序配置

时间:2014-05-12 19:42:32

标签: sql-server entity-framework

我使用的是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信息?或者我在这里咆哮错误的树?

1 个答案:

答案 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
}

希望这有帮助。