【问题标题】:Entity Framework changing connection string with c#实体框架使用 c# 更改连接字符串
【发布时间】:2016-02-08 23:16:20
【问题描述】:

我有一个应用程序,每个用户和机器的连接字符串都会发生变化。那就是说我制作了一个测试连接字符串只是为了对其进行测试。然后一旦工作,我将添加动态连接字符串。

经过一番研究,我发现连接字符串有问题。

如果有人能告诉我哪里错了,我将不胜感激。

var s = @"metadata=res://*/ProcurementModel.csdl|res://*/ProcurementModel.ssdl|
          res://*/ProcurementModel.msl;provider=System.Data.SqlClient;
          provider connection string=&';data source=JAMES-DESKTOP\SQLEXPRESS;initial catalog=MyDatabase;persist security info=True;user id=User;password=*****;MultipleActiveResultSets=True;App=EntityFramework&';";

更新:

public ProcurementContext()
{
    var s =
            @"metadata=res://*/ProcurementModel.csdl|res://*/ProcurementModel.ssdl|
            res://*/ProcurementModel.msl;provider=System.Data.SqlClient;
            provider connection string=&';data source=JAMES-DESKTOP\SQLEXPRESS;initial catalog=MyDatabase;persist security info=True;user id=jd;password=P@ssw0rd;MultipleActiveResultSets=True;App=EntityFramework&';";

    _connectionString = s;
}

获取数据:

public List<Procurement> ParcelListByUser(string userName)
{
    using (var context = new ProcurementEntities(_connectionString))
    {
        return context.Procurements.Where(p => p.UserName == userName).ToList();
    }
}

构造函数:

public ProcurementEntities(string connectionString)
    : base(connectionString)
{
}

错误信息:

初始化字符串的格式不符合规范 从索引 165 开始。

配置:

采购的配置

public class ProcurementConfiguration:DbConfiguration
{
    public ProcurementConfiguration()
    {
        SetExecutionStrategy("System.Data.SqlClient", () => new SqlAzureExecutionStrategy());
        SetDefaultConnectionFactory(new SqlConnectionFactory(ConnectionStrings.LocalConnectionString));
    }
}

【问题讨论】:

  • connection string=&amp;'; 看起来不对。应该是类似connection string="?
  • 如何设置这个字符串?我的意思是,你如何使用字符串“s”?
  • 你能详细说明你的 ProcurementEntities 构造函数是如何制作的吗?
  • 指的是您的错误:您使用的是哪个 dbms? sql服务器?哪个版本?

标签: c# entity-framework-6


【解决方案1】:

我认为问题出在您的连接字符串中。我做了同样的事情,我有一个以自动方式创建连接字符串的功能。

代码:

    public static string GetConnectionString()
    {
        // Build the provider connection string with configurable settings
        string cn = "server=" + mdlImpostazioni.p.dbServer;
        cn += ";database=" + mdlImpostazioni.p.dbName;
        cn += ";uid=" + mdlImpostazioni.p.dbUser;
        cn += ";pwd=" + mdlImpostazioni.p.dbPassword + ";";
        var providerSB = new SqlConnectionStringBuilder(cn);
        var efConnection = new EntityConnectionStringBuilder();
        // or the config file based connection without provider connection string
        efConnection.Provider = "System.Data.SqlClient";
        efConnection.ProviderConnectionString = providerSB.ConnectionString;
        // based on whether you choose to supply the app.config connection string to the constructor
        efConnection.Metadata = @"res://*";  //-----> very important
        return efConnection.ToString();
    }

通过这种方式,我将返回值传递给我的数据库上下文构造函数,就像在您的代码中一样。我的构造函数是:

public partial class Entities : DbContext
{
    public Entities(string nameOrConnectionString)
        : base(nameOrConnectionString)
    {

    }

    public void Close()
    {
        this.Dispose();
    }
}

试试看有没有问题。

【讨论】:

  • 在哪里实现 GetConnectionString()?在调用实体之前?
  • 我是这样使用的:dbContext = new Entities(GetConnectionString());
  • 这适用于我的 SQL Server,版本从 2008 年到 2014 年(2016 年从未测试过,但我认为也可以)
【解决方案2】:

动态更改连接字符串的一种方法是仅更改底层连接的连接字符串的实体框架。像这样的:

myDbContext.Database.Connection.ConnectionString = "Data source=JAMES-DESKTOP\SQLEXPRESS;initial catalog=MyDatabase;persist security info=True;user id=DynamicUser;password=DynamicPassword;MultipleActiveResultSets=True;App=EntityFrameworkForUser";

这样,您的应用程序不必对与实体框架(即元数据)相关的令牌进行硬编码。

【讨论】:

    猜你喜欢
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 2019-04-06
    • 2012-04-11
    • 2011-11-04
    • 1970-01-01
    相关资源
    最近更新 更多