public partial class ProcessContext : DbContext
{
static ProcessContext()
{
Database.SetInitializer<ProcessContext>(null);
}
public ProcessContext()
: base("Name=ProcessCS") //Comes from Config File
{
}
--DBSets
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
--Code
}
}
Il s'agit d'une base de données multi teneurs où nous avons 3 bases de données différentes. La base de données centralisée est dans un emplacement commun et ne sera pas modifiée. C'est là que le reste des détails de la base de données sera stocké. J'ai besoin de créer la chaîne de connexion @ runtime où les détails proviendront de cette base de données centralisée. Quelqu'un peut-il me faire savoir comment procéder?
J'ai essayé avec le code suivant, mais cela ne fonctionne pas. Cette méthode sera appelée ici
public ProcessContext()
: base(nameOrConnectionString: ConnectionString())
{
}
private static string ConnectionString()
{
SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder();
sqlBuilder.DataSource = "XXX";
sqlBuilder.InitialCatalog = "YYY";
sqlBuilder.PersistSecurityInfo = true;
sqlBuilder.IntegratedSecurity = true;
sqlBuilder.MultipleActiveResultSets = true;
EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();
entityBuilder.ProviderConnectionString = sqlBuilder.ToString();
entityBuilder.Metadata = "res://*/";
entityBuilder.Provider = "System.Data.SqlClient";
return entityBuilder.ToString();
}
Pour la connexion SQL Server, remplacez la classe de conteneur d'entité: (fonctionne dans EF6, SQL Server 2012 express, VS2013)
public partial class PxxxxEntities
{
private PxxxxEntities(string connectionString)
: base(connectionString)
{
}
public static PxxxxEntities ConnectToSqlServer(string Host, string catalog, string user, string pass, bool winAuth)
{
SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder
{
DataSource = Host,
InitialCatalog = catalog,
PersistSecurityInfo = true,
IntegratedSecurity = winAuth,
MultipleActiveResultSets = true,
UserID = user,
Password = pass,
};
// assumes a connectionString name in .config of MyDbEntities
var entityConnectionStringBuilder = new EntityConnectionStringBuilder
{
Provider = "System.Data.SqlClient",
ProviderConnectionString = sqlBuilder.ConnectionString,
Metadata = "res://*/DbModel.csdl|res://*/DbModel.ssdl|res://*/DbModel.msl",
};
return new PxxxxEntities(entityConnectionStringBuilder.ConnectionString);
}
}
Vous devez passer une chaîne de connexion ordinaire dans le constructeur DbContext
, pas une chaîne de connexion d'entité. Essayez donc de changer votre code comme suit:
public ProcessContext()
: base(ConnectionString())
{
}
private static string ConnectionString()
{
SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder();
sqlBuilder.DataSource = "XXX";
sqlBuilder.InitialCatalog = "YYY";
sqlBuilder.PersistSecurityInfo = true;
sqlBuilder.IntegratedSecurity = true;
sqlBuilder.MultipleActiveResultSets = true;
return sqlBuilder.ToString();
}
Vous devez changer Web.config
<connectionStrings>
<add name="DefaultConnection" connectionString="data source=mydb;initial catalog=mydatabase;persist security info=True;user id=sa;password=password;multipleactiveresultsets=True;application name=EntityFramework" providerName="System.Data.SqlClient" />
<add name="DataContext" connectionString="data source=mydb;initial catalog=mydatabase;persist security info=True;user id=sa;password=password;multipleactiveresultsets=True;application name=EntityFramework" providerName="System.Data.SqlClient" />
<!-- Here Add multiple database connection string -->
après avoir modifié le fichier ProcessContext.cs, un constructeur pour créer une connexion par défaut
public ProcessContext()
:base("name=DefaultConnection"){
//here code
}
autre connexion dynamique du constructeur parametrise à la base de données
public ProcessContext(string DynamicConnectionString)
:base(DynamicConnectionString){
// herer code }
ici pour la connexion par défaut est "DefaultConnection" mais vous avez une chaîne de connexion chnage donné du code à n'importe quel contrôleur
ProcessContext db=new ProcessContext();//this is default connection
ProcessContext db=new ProcessContext("DataContext");//dynamic change connection string
essayez ce code
Essayez d'utiliser un fichier app.config. Appelez ensuite la chaîne de connexion souhaitée par son nom:
using System.Configuration;
public ProcessContext()
: base(ConnectionString("foo"))
{
}
private static string ConnectionString(string connKey)
{
var conn = ConfigurationManager.ConnectionStrings[connKey].ConnectionString;
return conn;
}
Cette méthode a bien fonctionné pour moi. J'ai juste ajouté une autre chaîne de connexion nommée à mon app.config, puis passé le nom dans la méthode statique GetDbContext () ci-dessous, comme indiqué ci-dessous.
Exemple d'utilisation:
var dbAlternate = PxxxxEntities.GetDbContext("PxxxxEntitiesAlternate")
Ajoutez les éléments suivants à votre projet:
public partial class PxxxxEntities
{
private PxxxxEntities(string name)
: base("name=" + name)
{
}
public static PxxxxEntities GetDbContext(string name)
{
return new PxxxxEntities(name);
}
}