C# 如何在asp.net MVC 5中动态设置ConnectString的名称

C# 如何在asp.net MVC 5中动态设置ConnectString的名称,c#,visual-studio,asp.net-mvc-5,connection-string,C#,Visual Studio,Asp.net Mvc 5,Connection String,我有一个如下的连接字符串: <add name="EDentalCADBContext" connectionString="data source=*.*.*.*\SQLEXPRESS;Initial Catalog=*******;User id=*****;Password=******;" providerName="System.Data.SqlClient" /> 我动态创建了相同的ConnectionString,但无法设置ConnectionString的名称

我有一个如下的连接字符串:

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

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

如何动态设置名称


谢谢

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


然而,这是可能的。创建ConnectStringSettings实例时,在构造函数中传递“name”和“connectionString:

在注释中,您写道


我不想使用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
}
EDentalCADBContext上下文=新的EDentalCADBContext();
公共操作结果母版(int?页码、字符串表名)
{
EstablishConnection();//这将动态创建与DB的连接。
int?page=1;
ViewData[“MenuItems”]=MenuItem.ActivateMenu(“主控”);
ViewData[“Users”]=context.Users.ToList();
}
公共类EDentalCADBContext:DbContext
{
//公共EDentalCADBContext():基(“EDentalCADBContext”){}
公共DbSet通知项{get;set;}
公共数据库集用户{get;set;}

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

我在暗中摸索,不知道你的其余代码是如何工作的。但是你让我试试,所以我最好

如果您有自己的自定义类继承自DbContext,那么您必须实现自己的构造函数以接受连接字符串。您不能继承非默认构造函数。因此,我在下面修改了您的类,使其具有接受字符串的构造函数:

public class EDentalCADBContext : DbContext {
    public DbSet<NotificationItem> NotificationItems { get; set; }
    public DbSet<User> Users { get; set; }

    public EDentalCADBContext(string connectionNameOrString) :
        base(connectionStringOrName) {
    }
}
在您的EDentalCADBContext上下文类中。
然后,当您实例这个EDentalCADBContext时,您将传递一个连接字符串作为参数。
例如,EDentalCADBContext db=新的EDentalCADBContext(连接字符串)

你不应该这样做。你的web.config文件应该是只读的,并且不会被加载它的程序修改。你仍然可以,但我想知道你为什么要这样做,然后再继续。我不想使用web.config中的ConnectionString。我动态创建了它。因此我需要设置名称以使其与DBContext匹配。我已经复制了我的代码.context.Users.ToList()正在抛出错误。它正在connectionString中查找EDentalCADBContext名称。是否相同?@Rehaan,您从何处获取要连接的数据库的名称?是否来自会话?当用户登录时?我有一个包含SQL Server数据库名称的下拉列表。我没有测试过,但MSDN文档是特殊的只接受字符串的构造函数重载没有提到“连接字符串名称或实际字符串”,但这一个提到了:DbContext构造函数(字符串, DbCompiledModel)。两者都支持它吗?文档都错了吗?不过,我读错了。这两个重载都显式地声明了它:使用给定字符串作为要建立连接的数据库的名称或连接字符串构造一个新的上下文实例。每次我读它时,我的大脑都会诱使我阅读“连接字符串的名称”"我尝试了此操作,但它给出了相同的SQL错误。如果我在Web.Config中取消对ConnectionString的注释,则它是OK。如果我更改ConnectionString的名称,则给出相同的错误。错误是:在建立与SQL Server的连接时发生了与网络相关或特定于实例的错误。找不到或无法访问服务器。请验证e实例名称正确,并且SQL Server已配置为允许远程连接。(提供程序:SQL网络接口,错误:26-定位指定的服务器/实例时出错)@Rehaan请发布定义默认值的代码(无参数)
DbContext
的构造函数。您收到的错误听起来像是在连接字符串中使用了错误的
server=
值。它起作用了,但另一个抛出错误:[InvalidOperationException:此操作需要连接到“master”数据库。无法创建到“master”数据库的连接,因为原始数据库连接已打开,并且凭据已从连接字符串中删除。请提供未打开的连接。]你能告诉我我做得对吗?string providerString=sqlBuilder.ConnectionString;ConnectionString设置css=new ConnectionString设置(“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参考说明您可以传递连接字符串名称或实际的文字连接字符串。这两种方法都有效。我已复制了上面的代码。您能告诉我最好的解决方案吗?它有效,但另一个错误:[InvalidOperationException:此操作需要连接
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?
public EDentalCADBContext(string con = null)
    : base(string.IsNullOrEmpty(con) ? "name=EDentalCADBContext" : con)
{



}