Entity Framework - 在运行时更改连接字符串(需要解释) Entity Framework(实体框架)是一个用于.NET应用程序的对象关系映射(ORM)框架。它允许开发人员使用面向对象的方式来操作数据库,而不需要编写传统的SQL查询语句。 在某些情况下,我们可能需要在运行时更改Entity Framework的连接字符串。连接字符串用于指定应用程序与数据库之间的连接信息,包括服务器名称、数据库名称、用户名和密码等。 为了在运行时更改连接字符串,我们可以使用Entity Framewo

6 浏览
0 Comments

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")
    {
    }
}

0
0 Comments

在这个问题中,原因是无法在运行时更改Entity Framework的连接字符串。解决方法是创建一个工厂,根据选择的国家生成DbContext的实例,或者改变DbContext的构造函数。

在这个问题中,用户想要在运行时更改Entity Framework的连接字符串。他尝试使用db.ChangeDatabase()方法来更改连接字符串,但是发现只能更改已经存在的DbContext实例的连接字符串,而不能更改应用程序初始配置的连接字符串。其他用户提出了两种解决方法:一种是创建一个工厂来根据选择的国家生成DbContext的实例,另一种是改变DbContext的构造函数。

用户尝试了使用工厂方法来创建DbContext的实例,但是仍然无法更改连接字符串。他尝试了使用EntityConnectionStringBuilder来创建新的DbContext实例,但是仍然没有成功。

整个的问题过程中,用户提供了一些代码和相关信息,包括他的DbContext是基于数据库的,使用的是Entity Framework 6的版本等。其他用户也提供了一些解决方法和建议。

最终,用户还没有找到解决方法,他表示希望之前提供的解决方法能够起作用。

0
0 Comments

问题出现的原因:

问题的原因是希望在运行时更改连接字符串,根据不同的条件选择不同的数据库连接。

解决方法:

解决方法是通过在控制器类中创建一个静态方法,根据条件返回不同的连接字符串。然后,在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配置:


    
    

通过以上代码和配置,可以在运行时根据条件选择不同的连接字符串,从而实现动态更改连接字符串的功能。

0
0 Comments

问题的原因是无法在运行时更改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文件,您需要另外实现这一功能。

0