entity-framework - net - entity framework tutorial español
Cadena de conexión dinámica EF6 DBContext (5)
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
}
}
Este es un DB de Multi Tenent donde tenemos 3 DB diferentes. La base de datos centralizada está en una ubicación común y no se modificará. Aquí es donde se almacenará el resto de los detalles de la BD. Necesito crear la cadena de conexión @ runtime donde los detalles vendrán de esta base de datos centralizada. ¿Puede alguien por favor dejarme saber cómo hacerlo?
Intenté con el siguiente código, pero no funciona. Este método se llamará aquí
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();
}
Debería pasar una cadena de conexión común en el constructor DbContext
, no una cadena de conexión de entidad. Intente cambiar su código de la siguiente manera:
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();
}
Este método funcionó bien para mí. Acabo de agregar otra cadena de conexión con nombre a mi app.config y luego pasé el nombre al siguiente método estático GetDbContext () como se muestra a continuación.
Ejemplo de uso:
var dbAlternate = PxxxxEntities.GetDbContext("PxxxxEntitiesAlternate")
Agregue lo siguiente a su proyecto:
public partial class PxxxxEntities
{
private PxxxxEntities(string name)
: base("name=" + name)
{
}
public static PxxxxEntities GetDbContext(string name)
{
return new PxxxxEntities(name);
}
}
Intenta usar un archivo app.config. Luego llame a la cadena de conexión deseada por su nombre:
using System.Configuration;
public ProcessContext()
: base(ConnectionString("foo"))
{
}
private static string ConnectionString(string connKey)
{
var conn = ConfigurationManager.ConnectionStrings[connKey].ConnectionString;
return conn;
}
Para la conexión de SQL Server, anule la clase de contenedor de entidad: (funciona en 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);
}
}
Tienes que cambiar 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 -->
después de que tenga que modificar el archivo ProcessContext.cs un constructor para crear una conexión predeterminada
public ProcessContext()
:base("name=DefaultConnection"){
//here code
}
otra conexión dinámica del constructor de parametrise a la base de datos
public ProcessContext(string DynamicConnectionString)
:base(DynamicConnectionString){
// herer code }
Aquí la conexión predeterminada es "Conexión por defecto" pero usted tiene la cadena de conexión de chnage dado el código de cualquier controlador
ProcessContext db=new ProcessContext();//this is default connection
ProcessContext db=new ProcessContext("DataContext");//dynamic change connection string
prueba este código