【问题标题】:How to set the name of ConnectString dynamically in asp.net MVC 5如何在 asp.net MVC 5 中动态设置 ConnectString 的名称
【发布时间】:2015-11-09 04:51:55
【问题描述】:

我有一个connectionString如下:

 <add name="EDentalCADBContext" connectionString="data source=*.*.*.*\SQLEXPRESS;Initial Catalog=*******;User id=*****;Password=******;" providerName="System.Data.SqlClient" />

我动态创建了相同的 ConnectionString,但我无法设置 ConnectionString 的名称,例如上面的 name="EDentalCADBContext"。

如何动态设置名称?

谢谢

【问题讨论】:

  • 你不是故意的。您的 web.config 文件是只读的,不会被加载它的程序修改。您仍然可以,但我想知道您为什么要这样做,然后再继续。
  • 我不想使用 web.config 中的 ConnectionString。我动态创建了它。所以我需要设置名称以使其与 DBContext 匹配。
  • 我已经复制了我的代码。 context.Users .ToList() 正在引发错误。它在 connectionString 中寻找 EDentalCADBContext 名称。应该一样吗?
  • @Rehaan,你从哪里得到你想连接的数据库的名称?是来自会话吗?用户何时登录?
  • 我有一个下拉列表,其中包含来自 SQL Server 的数据库名称。

标签: c# visual-studio asp.net-mvc-5 connection-string


【解决方案1】:

我同意上面的@Dai。如果您在代码中动态创建它,那么放入配置包装器有什么意义。为什么不直接使用呢?整个界面的重点实际上是从常见的 .config 文件中读取内容。

尽管如此,可以做到的。创建 ConnectStringSettings 实例时,在构造函数中传递“名称”和“连接字符串”:https://msdn.microsoft.com/en-us/library/wd8h82yf(v=vs.110).aspx

【讨论】:

  • 你能告诉我我做得对吗? string providerString = sqlBuilder.ConnectionString; ConnectionStringSettings css = new ConnectionStringSettings("EDentalCADBContext", providerString); conn = new SqlConnection(css.ToString());
  • 我不希望 ToString() 必然返回连接字符串值。如果是这样,它仍然不是很清楚。请改用 css.ConnectionString 属性。但是,这似乎过于复杂。为什么不直接将 sqlBuilder.Connection 字符串传递给连接?例如:conn = new SqlConnection(sqlBuilder.ConnectionString);
  • ...作为替代方案,正如之前的帖子所指出的那样,如果最终在代码中您要访问 DbContext 对象,这将起作用: DbContext myContext = new DbContext(sqlBuilder.ConnectionString) ; -- MS 参考声明您可以传递连接字符串名称 - 或 - 实际的文字连接字符串。两者都有效。
  • 我已经复制了上面的代码。你能告诉我最好的解决方案吗?
【解决方案2】:
 EDentalCADBContext context = new EDentalCADBContext();

  public ActionResult Masters(int? pageNumber, string tableName)
                {
                    EstablishConnection(); // This creates the connection with DB dynamically.


                    int? page = 1;
                    ViewData["MenuItems"] = MenuItem.ActivateMenu("Masters");
                    ViewData["Users"] = context.Users.ToList();
        }

     public class EDentalCADBContext : DbContext
        {
           // public EDentalCADBContext() : base("EDentalCADBContext") { }
            public DbSet<NotificationItem> NotificationItems { get; set; }
            public DbSet<User> Users { get; set; }

它需要连接字符串的 EDentalCADBContext 名称。为什么要匹配?

【讨论】:

    【解决方案3】:

    我在不知道你的代码的其余部分是如何工作的情况下在黑暗中刺伤。但是你让我试一试,所以这是我最好的选择......

    如果您有自己的自定义类继承自 DbContext,那么您必须实现自己的构造函数来接收连接字符串。您无法继承非默认构造函数。所以我在下面修改了你的类,让它有一个构造函数来接收字符串:

    public class EDentalCADBContext : DbContext {
        public DbSet<NotificationItem> NotificationItems { get; set; }
        public DbSet<User> Users { get; set; }
    
        public EDentalCADBContext(string connectionNameOrString) :
            base(connectionStringOrName) {
        }
    }
    

    你会像这样实例化:

    EDentalCADBContext context = new EDentalCADBContext("literal conn string");
    // Perhaps comes from sqlBuilder.ConnectionString per your comments?
    

    【讨论】:

    • 它工作但另一个错误:[InvalidOperationException:此操作需要连接到“主”数据库。无法创建到“主”数据库的连接,因为原始数据库连接已打开并且凭据已从连接字符串中删除。提供一个未打开的连接。]
    • 已经这样做了。抛出与以前相同的错误: ...但是如果我在 web.config 中使用它,connectString 没有任何问题,因为它可以正常工作。建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。 (提供者:SQL 网络接口,错误:26 - 错误定位服务器/指定的实例)
    【解决方案4】:

    在您的评论中,您写道

    我不想使用 web.config 中的 ConnectionString。我动态创建了它。所以我需要设置名称以使其与 DBContext 匹配

    解决方案是不匹配 DbContext 期望的“魔术字符串”(我想这是在 Visual Studio 中使用 EF 向导时指定的),而是使用接受原始连接字符串的 DbContext 构造函数:

    String connectionString = "server=dbserver.local;Integrated Security=SSPI;...";
    using( DbContext db = new DbContext( connectionString ) ) {
        // do stuff
    }
    

    【讨论】:

    • 我没有对此进行测试,但 MSDN 文档很奇特。仅接受字符串的构造函数重载没有提及“连接字符串名称或实际字符串”,但这个确实:DbContext Constructor (String, DbCompiledModel) msdn.microsoft.com/en-us/library/…。是否都支持它并且文档有误?
    • 没关系,我读错了。两个重载都明确指出:使用给定字符串作为名称 - 或 - 连接将要连接到的数据库的连接字符串构造一个新的上下文实例。 每次我读到它,我的大脑都会欺骗我阅读“名称-OF-连接字符串”
    • 我试过这个,但它给了我同样的 SQL 错误。如果我在 Web.Config 中取消注释 ConnectionString,那么它就可以了。如果我更改 ConnectionString 的名称,则会出现相同的错误。错误是:建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。 (提供者:SQL 网络接口,错误:26 - 错误定位服务器/指定的实例)
    • @Rehaan 请发布为您的DbContext 定义默认(无参数)构造函数的代码。您收到的错误听起来像是您在连接字符串中使用了错误的 server= 值。
    • 它工作但另一个抛出错误:[InvalidOperationException:此操作需要连接到“主”数据库。无法创建到“主”数据库的连接,因为原始数据库连接已打开并且凭据已从连接字符串中删除。提供一个未打开的连接。]
    【解决方案5】:
    public EDentalCADBContext(string con = null)
        : base(string.IsNullOrEmpty(con) ? "name=EDentalCADBContext" : con)
    {
    
    
    
    }
    

    在您的 EDentalCADBContext 上下文类中。
    然后,当您实例化此 EDentalCADBContext 时,您将连接字符串作为参数传递。 前任。 EDentalCADBContext db = new EDentalCADBContext(连接字符串);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 2013-12-05
      • 1970-01-01
      • 2012-08-22
      • 2017-01-04
      相关资源
      最近更新 更多