web-dev-qa-db-fra.com

Chaîne de connexion dynamique EF6 DBContext

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();
}
21
Gautham Nayak

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);
    }
}
24
albert

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();
}
14
luksan

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

3
Mehul Akabari

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;
}
1
Celso Jr

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);
    }
}
1
dodgy_coder