Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF代码的动态连接字符串优先_C#_Entity Framework_Connection String - Fatal编程技术网

C# EF代码的动态连接字符串优先

C# EF代码的动态连接字符串优先,c#,entity-framework,connection-string,C#,Entity Framework,Connection String,我当前驻留在Web.config中的连接字符串如下: <add name="PersonDBContext" connectionString="Server=111.111.1.11; Database=MyProgram; User Id=admin; Password=12345; Integrated Security=False" providerName="System.Data.Sql

我当前驻留在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,要么应该为EntityConnectionStringBuilder类提供元数据。你能告诉我一种方法吗

为什么不在DbContext派生类的构造函数中将其作为普通字符串传递? 像


就是这样,

string entityConnStr = "Data Source=111.111.1.11;Initial Catalog=MyProgram;User Id=admin;Password=12345;Integrated Security=False";

我需要做的是创建一个动态连接字符串,以便用户能够输入或选择他们想要连接的服务器,如下所示:

在EF创建的Model.Context.cs文件中,我将构造函数更改为:

public partial class Entities : DbContext
{
    public Entities()
        : base(BuildConnectionString)
    {
    }
    ...
}
然后我编写了一个扩展类entitisex.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();
        }
    }
部分类实体:DbContext
{
私有静态字符串BuildConnectionString
{
得到
{
//指定提供程序名称、服务器和数据库。
string providerName=“System.Data.SqlClient”;
字符串serverName=DatabaseController.Server;
字符串databaseName=;
//初始化的连接字符串生成器
//基础提供者。
SqlConnectionStringBuilder sqlBuilder=新的SqlConnectionStringBuilder();
//设置数据源的属性。
sqlBuilder.DataSource=serverName;
sqlBuilder.InitialCatalog=数据库名称;
sqlBuilder.UserID=;
sqlBuilder.Password=;
sqlBuilder.IntegratedSecurity=false;
sqlBuilder.PersistSecurityInfo=true;
sqlBuilder.MultipleActiveResultSets=true;
//构建SqlConnection字符串。
string providerString=sqlBuilder.ToString();
//初始化EntityConnectionStringBuilder。
EntityConnectionStringBuilder entityBuilder=新EntityConnectionStringBuilder();
//设置提供程序名称。
entityBuilder.Provider=providerName;
//设置特定于提供程序的连接字符串。
entityBuilder.ProviderConnectionString=providerString;
//程序集全名
类型t=类型(实体);
字符串assemblyFullName=t.Assembly.FullName.ToString();
//设置元数据位置。
entityBuilder.Metadata=string.Format(“res://{0}/”,//Models.Model.csdl | Models.Model.ssdl | Models.Model.msl”,
(全名);
尝试
{
//连接测试
使用(EntityConnection conn=new EntityConnection(entityBuilder.ToString()))
{
conn.Open();
康涅狄格州关闭();
}
}
捕获(例外情况除外)
{
抛出新异常(“连接错误”+ex.Message);
}
返回entityBuilder.ToString();
}
}

作为一个缺点,每次从数据库生成模型时,您都必须更改Entities类(model.Context.cs)中的构造函数。

代码的动态连接字符串首先使用简单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();
}

我猜你使用的是access db,对吗?@sakir我使用的是SQL db。当Model.Context.cs被覆盖时,你可以改为创建一个新文件,比如Entities.cs。在
公共部分类Entities
中,由于已经定义了无参数构造函数,请添加一个包含1个参数的构造函数。如果你要忽略此参数,请uld从无参数静态方法调用构造函数。因为这没有指定提供程序。这将如何帮助连接其他数据库提供程序MySql、MSQL等。提供程序在哪里@jason@NarendraSinghRathore同意…我能找到的每个例子都是这样的。如果是代码优先,他们会忽略提供程序,如果他们包括提供程序,那就是将其视为已建模。如果能在代码优先的示例中看到提供程序是如何包含的,那就太好了。
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();
        }
    }
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();
}