实体框架-在运行时更改连接字符串(需要解释)

多纳塔斯

对于将此问题发布为我深表歉意,但是我还无法在我的问题的实际解决方案下发表评论,此处对此进行了回答此解决方案也无法以相同的方式工作。

我使用了该解决方案,该扩展似乎可以实际工作,而不必更改连接。它与web.config文件中定义的相同如果删除该连接字符串,则会出现错误,提示EF无法找到它。

我的方法是首先使用数据库(此外,它是SQL Server 2000 ...)和EF版本6(基本上是最新版本)

所以我的问题是-它应该如何工作?

  • 我是否必须将扩展名中定义的连接名传递给它,web.config还是应该不同?

我当前的连接字符串如下所示:

<connectionStrings>
    <add name="CATALOGEntities" connectionString="metadata=~/bin/Models\InfoModel.csdl|~/bin/Models\InfoModel.ssdl|~/bin/Models\InfoModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=SERVER;initial catalog=CATALOG;integrated security=False;User Id=admin;Password=admin123;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
</connectionStrings>

尝试1:这就是我要传递给扩展方法的内容:

ConnectionTools.ChangeDatabase(db, "ANOTHERCATALOG", "ANOTHERSERVER", "admin", "admin456", false, "ANOTHERCATALOGEntities"); 

尝试2:也尝试由VDohnal建议:

db.ChangeDatabase("ANOTHERCATALOG", "ANOTHERSERVER", "admin", "admin456", false, "ANOTHERCATALOGEntities"); 

ATTEMPT 3具有:

public partial class CATALOGEntities : DbContext { 
    public CATALOGEntities(string connectionString) : base(connectionString) { } 
    public CATALOGEntities() { 
        // TODO: Complete member initialization 
        Database.SetInitializer<CATALOGEntities>(null); 
    }
}

尝试4:也不起作用(假设我在web.configsource)中定义了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
{
    // all params are optional
    public static void ChangeDatabase(
        this CATALOGEntities source,
        string initialCatalog = "",
        string dataSource = "",
        string userId = "",
        string password = "",
        bool integratedSecuity = false,
        string configConnectionStringName = "")
    /* this would be used if the
    *  connectionString name varied from 
    *  the base EF class name */
    {
        try
        {
            // use the const name if it's not null, otherwise
            // using the convention of connection string = EF contextname
            // grab the type name and we're done
            var configNameEf = string.IsNullOrEmpty(configConnectionStringName)
                ? source.GetType().Name
                : configConnectionStringName;

            // add a reference to System.Configuration
            var entityCnxStringBuilder = new EntityConnectionStringBuilder
                (System.Configuration.ConfigurationManager
                    .ConnectionStrings[configNameEf].ConnectionString);

            // init the sqlbuilder with the full EF connectionstring cargo
            var sqlCnxStringBuilder = new SqlConnectionStringBuilder
                (entityCnxStringBuilder.ProviderConnectionString);

            // only populate parameters with values if added
            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;

            // set the integrated security status
            sqlCnxStringBuilder.IntegratedSecurity = integratedSecuity;

            // now flip the properties that were changed
            source.Database.Connection.ConnectionString
                = sqlCnxStringBuilder.ConnectionString;
        }
        catch (Exception ex)
        {
            // set log item if required
        }
    }
}

我的DbContext:

public partial class CATALOGEntities : DbContext
{
    public CATALOGEntities()
        : base("name=CATALOGEntities")
    {
    }
}
多纳塔斯

解决方案:这终于对我有用。

负责访问SQL Server的控制器类:

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条目:

<connectionStrings>
    <add name="CATALOGEntitiesUK" connectionString="[...]" providerName="System.Data.EntityClient" />
    <add name="CATALOGEntitiesUSA" connectionString="[...]" providerName="System.Data.EntityClient" />
</connectionStrings>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

实体框架在运行时设置连接字符串

来自分类Dev

使用实体框架,依赖注入,工作单元和存储库模式在运行时注入/管理更改连接字符串

来自分类Dev

实体框架6设置连接字符串运行时

来自分类Dev

实体框架表名称在运行时映射

来自分类Dev

在运行时访问实体框架存储模型

来自分类Dev

实体框架在运行时应用迁移

来自分类Dev

实体框架 webapi c# 连接字符串更改

来自分类Dev

实体框架自连接

来自分类Dev

实体框架保存更改

来自分类Dev

实体框架更新更改

来自分类Dev

事务运行时实体框架超时

来自分类Dev

实体框架6在运行时更改数据列名称

来自分类Dev

在运行时更改按钮框架

来自分类Dev

在运行时更改按钮框架

来自分类Dev

实体框架-解释我的代码

来自分类Dev

字符串实体框架映射列表

来自分类Dev

字符串实体框架映射列表

来自分类Dev

实体框架-字符串转换错误

来自分类Dev

需要 MVC 实体框架的帮助

来自分类Dev

实体框架代码优先连接

来自分类Dev

实体框架:自连接错误

来自分类Dev

实体框架更改主键类型

来自分类Dev

实体框架7保存更改

来自分类Dev

实体框架更改键类型

来自分类Dev

实体框架不应用更改

来自分类Dev

实体框架中的动态连接字符串

来自分类Dev

实体框架6在代码中设置连接字符串

来自分类Dev

如何更新实体框架连接字符串

来自分类Dev

实体框架中的连接字符串问题