我当前驻留在Web.config中的连接字符串是:
<add name="PersonDBContext"
connectionString="Server=111.111.1.11;
Database=MyProgram;
User Id=admin;
Password=12345;
Integrated Security=False"
providerName="System.Data.SqlClient" />
我想以动态方式向程序提供相同的连接字符串,这是我的尝试:
EntityConnectionStringBuilder csb = new EntityConnectionStringBuilder();
csb.ProviderConnectionString = "Data Source=111.111.1.11;Initial Catalog=MyProgram;User Id=admin;Password=12345;Integrated Security=False";
csb.Provider = "System.Data.SqlClient";
String entityConnStr = csb.ToString();
return entityConnStr;
这就是我得到的:
你能告诉我我做错了什么吗? 我是否需要Code First连接字符串的元数据?感谢。不支持关键字:'provider'。
编辑: 我想我要么不应该使用EntityConnectionStringBuilder,要么我应该为EntityConnectionStringBuilder类提供元数据。你能告诉我一个如何做到这一点的方法吗?
答案 0 :(得分:3)
为什么不在DbContext派生类的构造函数中将它作为普通字符串传递? 像
var ctx = new MyContext("Data Source=111.111.1.11;Initial Catalog=MyProgram;User Id=admin;Password=12345;Integrated Security=False");
答案 1 :(得分:2)
我需要做的是拥有动态连接字符串,以便用户能够键入或选择他们想要连接的服务器,如下所示:
在EF创建的Model.Context.cs文件中,我将构造函数更改为:
public partial class Entities : DbContext
{
public Entities()
: base(BuildConnectionString)
{
}
...
}
然后我写了一个扩展类EntitiesEx.cs
partial class Entities : DbContext
{
private static string BuildConnectionString
{
get
{
// Specify the provider name, server and database.
string providerName = "System.Data.SqlClient";
string serverName = DatabaseController.Server;
string databaseName = <DatabaseName>;
// Initialize the connection string builder for the
// underlying provider.
SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder();
// Set the properties for the data source.
sqlBuilder.DataSource = serverName;
sqlBuilder.InitialCatalog = databaseName;
sqlBuilder.UserID = <user>;
sqlBuilder.Password = <password>;
sqlBuilder.IntegratedSecurity = false;
sqlBuilder.PersistSecurityInfo = true;
sqlBuilder.MultipleActiveResultSets = true;
// Build the SqlConnection connection string.
string providerString = sqlBuilder.ToString();
// Initialize the EntityConnectionStringBuilder.
EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();
//Set the provider name.
entityBuilder.Provider = providerName;
// Set the provider-specific connection string.
entityBuilder.ProviderConnectionString = providerString;
//assembly full name
Type t = typeof(Entities);
string assemblyFullName = t.Assembly.FullName.ToString();
// Set the Metadata location.
entityBuilder.Metadata = string.Format("res://{0}/", //Models.Model.csdl|Models.Model.ssdl|Models.Model.msl",
assemblyFullName);
try
{
//Test de conexion
using (EntityConnection conn = new EntityConnection(entityBuilder.ToString()))
{
conn.Open();
conn.Close();
}
}
catch (Exception ex)
{
throw new Exception("Connection error" + ex.Message);
}
return entityBuilder.ToString();
}
}
作为一个骗局,每次从数据库生成模型时,您都必须在Entities类中更改构造函数(Model.Context.cs)
答案 2 :(得分:1)
Code First的动态连接字符串使用简单的sql连接字符串或不使用EntityConnectionStringBuilder。所以你可以按照以下方式实现它。
public static string DynamicConnectionString(SqlConnectionStringBuilder builder)
{
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
builder.DataSource = "ServerName";
builder.InitialCatalog = "DatabaseName";
builder.UserID = "UserId";
builder.Password = "Password";
builder.MultipleActiveResultSets = true;
builder.PersistSecurityInfo = true;
return builder.ConnectionString.ToString();
}
答案 3 :(得分:0)
就是这样:
string entityConnStr = "Data Source=111.111.1.11;Initial Catalog=MyProgram;User Id=admin;Password=12345;Integrated Security=False";