12

我想在运行时为我的数据库提供连接字符串。我正在使用实体框架。这是我到目前为止所拥有的

class MyClassDBContext:DbContext
{
  public MyClassDBContext(string str) : base(str)
  {
    this.Database.Connection.ConnectionString = str;
  }
}

要使用上面的代码,我试过了

//create connection string
EntityConnectionStringBuilder myConn = new EntityConnectionStringBuilder();
myConn.Provider = "System.Data.SqlClient";
myConn.ProviderConnectionString = "user id=xxxx;password=xxxx;server=localhost;database=xxxx;connection timeout=30";

//inject the connection string at runtime
MyClassDBContext a = new MyClassDBContext(myConn.ToString())

上面的代码给了我一个错误,说“不支持提供者关键字”。为了尝试调试此错误,我尝试了以下

 MyClassDBContext a = new MyClassDBContext("metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlClient;provider connection string=user id=xxxx;password=xxxx;server=localhost;database=xxxx;connection timeout=30")

现在,我收到一条错误消息,提示“不支持元数据关键字”。所以我将代码更改为

MyClassDBContext a = new MyClassDBContext("provider=System.Data.SqlClient;provider connection string=user id=xxxx;password=xxxx;server=localhost;database=xxxx;connection timeout=30")

现在我收到一条错误消息,提示“不支持提供者关键字”。所以我再次将我的代码更改为

 MyClassDBContext a = new MyClassDBContext("user id=xxxx;password=xxxx;server=localhost;database=xxxx;connection timeout=30")

现在它可以工作了!我的问题是:如何在运行时指定提供程序和元数据?看起来只有连接字符串被接受。我正在使用 Nuget 的 Entity 4.3.1。

谢谢

4

5 回答 5

13

基于 edmx 文件的 EF 需要“提供者”和“元数据”内容。基于代码优先的 EF 不需要这个,只需要常规连接字符串。如果您愿意,可以使用SqlConnectionStringBuilder( 而不是EntityConnectionStringBuilder) 来构建这个正常的连接字符串。但正如您所见,您只需要指定实际的连接详细信息。EF 4.3.1 的 DbContext 代码优先范例中不需要提供程序和元数据。

于 2012-07-06T21:07:53.837 回答
10

基于HatSoft 的回答

var entityConnectionStringBuilder= new EntityConnectionStringBuilder();
entityConnectionStringBuilder.Provider = "System.Data.SqlClient";
entityConnectionStringBuilder.ProviderConnectionString = <your SQL Server connection string>;
entityConnectionStringBuilder.Metadata = "res://*";

MyClassDBContext a = new MyClassDBContext(entityConnectionStringBuilder.ToString());
于 2013-05-21T20:28:36.750 回答
7

EntityConnectionStringBuilder 类可用于在运行时指定提供程序和元数据

例如

var entityConnectionStringBuilder= new EntityConnectionStringBuilder(); entityConnectionStringBuilder.Provider = "System.Data.SqlClient"; entityConnectionStringBuilder.Metadata = "res:// /Example.csdl|res:// /Example.ssdl|res://*/Example.msl";

请参阅元数据中有关CSDL、SSDL 和 MSDL的更多信息

于 2012-07-06T20:15:06.957 回答
4

我跟着这个链接

还有这个

如何在没有 app.conf 文件的情况下使用 EF Code-First?

基本上我所做的几乎和你一样,用字符串创建一个构造函数并调用基数。

但我也在这个构造函数中设置了提供者。

这是一个例子

public Context(string ConnectionString) : base(ConnectionString) { 
    Database.DefaultConnectionFactory = new SqlCeConnectionFactory("Oracle.DataAccess.Client"); 
}

这样您就可以指定提供者。而且您不会收到提供者关键字错误,因为您不需要在连接字符串中指定

我是这样称呼它的。

var dbCont = new ClassLibrary1.Models.Context("DATA SOURCE=xxx;PASSWORD=xxx;USER ID=xxx");

希望能帮助我花了很长时间才找到它

于 2013-04-05T22:27:03.090 回答
2

这是老问题,但也许对某人有用

 var provider = (DbProviderFactory)System.Data.Entity.DbConfiguration
            .DependencyResolver
            .GetService(typeof(DbProviderFactory), "invariant provider name");

        var conn = provider.CreateConnection();
        //conn.ConnectionString = "sample connection string";

        DbInterception.Dispatch.Connection.SetConnectionString(conn, new DbConnectionPropertyInterceptionContext<string>()
            .WithValue("sample connection string"));

return new SampleDbContext(conn,true);
于 2016-08-24T11:28:59.497 回答