Entity Framework - 在运行时更改连接字符串(需要解释) Entity Framework(实体框架)是一个用于.NET应用程序的对象关系映射(ORM)框架。它允许开发人员使用面向对象的方式来操作数据库,而不需要编写传统的SQL查询语句。 在某些情况下,我们可能需要在运行时更改Entity Framework的连接字符串。连接字符串用于指定应用程序与数据库之间的连接信息,包括服务器名称、数据库名称、用户名和密码等。 为了在运行时更改连接字符串,我们可以使用Entity Framewo
Entity Framework - 在运行时更改连接字符串(需要解释) Entity Framework(实体框架)是一个用于.NET应用程序的对象关系映射(ORM)框架。它允许开发人员使用面向对象的方式来操作数据库,而不需要编写传统的SQL查询语句。 在某些情况下,我们可能需要在运行时更改Entity Framework的连接字符串。连接字符串用于指定应用程序与数据库之间的连接信息,包括服务器名称、数据库名称、用户名和密码等。 为了在运行时更改连接字符串,我们可以使用Entity Framewo
抱歉以问题的形式发布此内容,但我还无法在我的问题的实际解决方法下进行评论,该问题的答案在这里得到了回答。同样,这个解决方案也无法以相同的方式工作。
我使用了那个解决方案,该扩展似乎可以正常工作,除了无法更改连接之外。它仍然保持与web.config
文件中定义的相同。如果我删除该连接字符串,EF会报错找不到它。
我的方法是数据库优先(而且是SQL Server 2000...),EF版本6(基本上是最新的)。
所以我的问题是 - 它应该如何工作?
- 我是否必须将与
web.config
中定义的相同连接名称传递给扩展方法,还是应该使用不同的名称?
我的当前连接字符串如下所示:
尝试1:这是我传递给扩展方法的内容:
ConnectionTools.ChangeDatabase(db, "ANOTHERCATALOG", "ANOTHERSERVER", "admin", "admin456", false, "ANOTHERCATALOGEntities");
尝试2:也尝试了VDohnal的建议:
db.ChangeDatabase("ANOTHERCATALOG", "ANOTHERSERVER", "admin", "admin456", false, "ANOTHERCATALOGEntities");
尝试3使用:
public partial class CATALOGEntities : DbContext { public CATALOGEntities(string connectionString) : base(connectionString) { } public CATALOGEntities() { // TODO: Complete member initialization Database.SetInitializer(null); } }
尝试4:也不起作用(假设我在web.config
中定义了2个连接字符串(来源)):
if (infoWhole.QueryDetails.IsCountryUK) { string strConn = ConfigurationManager.ConnectionStrings["CATALOGEntities"].ConnectionString; db = new CATALOGEntities(strConn); } else { string strConn = ConfigurationManager.ConnectionStrings["CATALOGEntitiesUSA"].ConnectionString; db = new CATALOGEntities(strConn); }
- 此外,我应该将哪个数据源传递给扩展方法 - 整个
DbContext
还是在我正在工作的控制器类中定义的CATALOGEntities
?
这是我正在使用的扩展方法:
public static class ConnectionTools { // 所有参数都是可选的 public static void ChangeDatabase( this CATALOGEntities source, string initialCatalog = "", string dataSource = "", string userId = "", string password = "", bool integratedSecuity = false, string configConnectionStringName = "") /* 如果connectionString名称与基本EF类名不同,将使用此方法 */ { try { // 如果const名称不为空,则使用const名称,否则使用连接字符串=EF contextname的约定 // 获取类型名称,完成 var configNameEf = string.IsNullOrEmpty(configConnectionStringName) ? source.GetType().Name : configConnectionStringName; // 添加对System.Configuration的引用 var entityCnxStringBuilder = new EntityConnectionStringBuilder (System.Configuration.ConfigurationManager .ConnectionStrings[configNameEf].ConnectionString); // 使用完整的EF连接字符串初始化sqlbuilder var sqlCnxStringBuilder = new SqlConnectionStringBuilder (entityCnxStringBuilder.ProviderConnectionString); // 仅在添加时填充参数值 if (!string.IsNullOrEmpty(initialCatalog)) sqlCnxStringBuilder.InitialCatalog = initialCatalog; if (!string.IsNullOrEmpty(dataSource)) sqlCnxStringBuilder.DataSource = dataSource; if (!string.IsNullOrEmpty(userId)) sqlCnxStringBuilder.UserID = userId; if (!string.IsNullOrEmpty(password)) sqlCnxStringBuilder.Password = password; // 设置集成安全性状态 sqlCnxStringBuilder.IntegratedSecurity = integratedSecuity; // 现在翻转更改的属性 source.Database.Connection.ConnectionString = sqlCnxStringBuilder.ConnectionString; } catch (Exception ex) { // 如果需要,设置日志项 } } }
我的DbContext:
public partial class CATALOGEntities : DbContext { public CATALOGEntities() : base("name=CATALOGEntities") { } }
在这个问题中,原因是无法在运行时更改Entity Framework的连接字符串。解决方法是创建一个工厂,根据选择的国家生成DbContext的实例,或者改变DbContext的构造函数。
在这个问题中,用户想要在运行时更改Entity Framework的连接字符串。他尝试使用db.ChangeDatabase()
方法来更改连接字符串,但是发现只能更改已经存在的DbContext实例的连接字符串,而不能更改应用程序初始配置的连接字符串。其他用户提出了两种解决方法:一种是创建一个工厂来根据选择的国家生成DbContext的实例,另一种是改变DbContext的构造函数。
用户尝试了使用工厂方法来创建DbContext的实例,但是仍然无法更改连接字符串。他尝试了使用EntityConnectionStringBuilder
来创建新的DbContext实例,但是仍然没有成功。
整个的问题过程中,用户提供了一些代码和相关信息,包括他的DbContext是基于数据库的,使用的是Entity Framework 6的版本等。其他用户也提供了一些解决方法和建议。
最终,用户还没有找到解决方法,他表示希望之前提供的解决方法能够起作用。
问题出现的原因:
问题的原因是希望在运行时更改连接字符串,根据不同的条件选择不同的数据库连接。
解决方法:
解决方法是通过在控制器类中创建一个静态方法,根据条件返回不同的连接字符串。然后,在DbContext类的构造函数中使用该连接字符串初始化DbContext。
以下是解决方法的具体代码和配置:
控制器类:
public class FrequentlyAccessedQueries : Controller { private CATALOGEntities db = FrequentlyAccessedQueries.entities(); public static CATALOGEntities entities() { QueryDetails qdetails = new QueryDetails(); bool uk = qdetails.IsCountryUK; if (uk) { return new CATALOGEntities("name=CATALOGEntitiesUK"); } else { return new CATALOGEntities("name=CATALOGEntitiesUSA"); } } }
DbContext类:
public partial class CATALOGEntities : DbContext { public CATALOGEntities(string connectionString) : base(connectionString) { } }
web.config配置:
通过以上代码和配置,可以在运行时根据条件选择不同的连接字符串,从而实现动态更改连接字符串的功能。
问题的原因是无法在运行时更改Entity Framework的连接字符串。解决方法是使用SqlConnectionStringBuilder
类从web.config
文件中读取连接字符串,并将其中的相关部分替换为新的详细信息。
解决方法的代码如下:
var builder = new SqlConnectionStringBuilder(ConfigurationManager.ConnectionStrings["YourConnectionStringName"].ConnectionString); builder.DataSource = "NewServer"; builder.InitialCatalog = "NewDatabase"; builder.UserID = "NewUserId"; builder.Password = "NewPassword"; using (var context = new YourDbContext(builder.ConnectionString)) { // 使用新的连接字符串执行操作 }
需要注意的是,这种方法假设其他数据库具有相同的模型。在这种情况下,您可以将与控制器相关的上下文传递给方法,并将当前连接字符串的名称作为最后一个参数传递(除非它与您的上下文具有相同的名称,否则可以省略)。
请注意,这种方法只适用于连接字符串的更改,并不能自动更新web.config
文件中的连接字符串。因此,如果您想在运行时更改连接字符串并将其写回web.config
文件,您需要另外实现这一功能。