对于将此问题发布为我深表歉意,但是我还无法在我的问题的实际解决方案下发表评论,此处对此进行了回答。此解决方案也无法以相同的方式工作。
我使用了该解决方案,该扩展似乎可以实际工作,而不必更改连接。它与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="data source=SERVER;initial catalog=CATALOG;integrated security=False;User Id=admin;Password=admin123;MultipleActiveResultSets=True;App=EntityFramework"" 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.config
(source)中定义了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] 删除。
我来说两句