web-dev-qa-db-fra.com

Comment définir par programme la chaîne de connexion pour Entity-Framework Code-First?

J'essaie d'écrire du code qui me permet de basculer entre SQLCE (localement sur ma machine de développement) et SQL complet (sur AppHarbor). Avec SQL CE, la chaîne de connexion est entièrement gérée pour moi, mais je dois la construire moi-même pour SQL. Mon code est jusqu'ici ci-dessous, cependant, il donne cette erreur:

Mot clé non pris en charge: 'métadonnées'

Je cherche en ligne depuis des heures, mais toutes les solutions impliquent l'utilisation d'une classe "ContextBuilder" que je ne trouve pas (j'ai installé EF via le package NuGet).

Voici le code actuel (s'exécutant au démarrage via WebActivator):

public static void Start()
{
    // Read the details from AppSettings. Locally, these will be empty.
    var databaseHost = ConfigurationManager.AppSettings["DatabaseHost"];
    var databaseName = ConfigurationManager.AppSettings["DatabaseName"];
    var databaseUsername = ConfigurationManager.AppSettings["DatabaseUsername"];
    var databasePassword = ConfigurationManager.AppSettings["DatabasePassword"];

    // Check whether we have actual SQL Server settings.
    if (!string.IsNullOrWhiteSpace(databaseHost) && !string.IsNullOrWhiteSpace(databaseName))
    {
        // Set up connection string for a real live database :-O
        var connectionString = string.Format("metadata=res://*/DB.csdl|res://*/DB.ssdl|res://*/DB.msl;"
            + "provider=System.Data.SqlClient; provider connection string='Data Source={0};"
            + "Initial Catalog={1};User ID={2}; Password={3};MultipleActiveResultSets=True'",
            databaseHost, databaseName, databaseUsername, databasePassword);

        Database.DefaultConnectionFactory = new SqlConnectionFactory(connectionString);
    }
    else
    {
        // Set a custom database initializer for setting up dev database test data.
        Database.SetInitializer<BlogDataContext>(new BlogDataIntializer());

        // Set the connection factory for SQL Compact Edition.
        Database.DefaultConnectionFactory = new SqlCeConnectionFactory("System.Data.SqlServerCe.4.0");
    }
}
39
Danny Tuppeny

vous devez utiliser la classe EntityConnectionStringBuilder

string providerName = "System.Data.SqlClient";
string serverName = ".";
string databaseName = "AdventureWorks";

// Initialize the connection string builder for the
// underlying provider.
SqlConnectionStringBuilder sqlBuilder =
new SqlConnectionStringBuilder();

// Set the properties for the data source.
sqlBuilder.DataSource = serverName;
sqlBuilder.InitialCatalog = databaseName;
sqlBuilder.IntegratedSecurity = true;

// Build the SqlConnection connection string.
string providerString = sqlBuilder.ToString();

// Initialize the EntityConnectionStringBuilder.
EntityConnectionStringBuilder entityBuilder =
new EntityConnectionStringBuilder();

//Set the provider name.
entityBuilder.Provider = providerName;

// Set the provider-specific connection string.
entityBuilder.ProviderConnectionString = providerString;

// Set the Metadata location.
entityBuilder.Metadata = @"res://*/AdventureWorksModel.csdl|
                        res://*/AdventureWorksModel.ssdl|
                        res://*/AdventureWorksModel.msl";
Console.WriteLine(entityBuilder.ToString());

using (EntityConnection conn =
new EntityConnection(entityBuilder.ToString()))
{
conn.Open();
Console.WriteLine("Just testing the connection.");
conn.Close();
}
43
Ghyath Serhal

Dans Entity-Framework Code-First, utilisez SqlConnection. Vous ne pouvez pas utiliser EntityConnectionStringBuilder car il n'y a pas de fichier de métadonnées dans le code en premier.

12
rraszewski

Vous pouvez également le définir directement sur votre contexte. Vous devez attacher le fichier MDF à l'instance SqlServer que vous souhaitez utiliser en premier. Pas vraiment élégant mais ça a marché pour moi

public void DoImportWork()
{
   var ctx = new StatisticsContext(); << your DbContext 

   ctx.Database.Connection.ConnectionString = @"Data Source=localhost\SQLEXP;AttachDbFilename=""C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXP\MSSQL\DATA\StatisticsData.mdf"";Integrated Security=True";

   ctx.Database.Connection.Open();
}

comme d'habitude, EF générera tout automatiquement lorsque vous ajouterez votre première ligne au contexte.

8
user2882366

Ce code vous sera utile pour créer connection string avec Entity Framework

public string GenerateEFConnectionString(string serverName, string dbName,string ModelName,string userName,string password)
{   
    // Initialize the connection string builder for the underlying provider.
    SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder();
    sqlBuilder.DataSource = serverName;
    sqlBuilder.InitialCatalog = dbName;
    //sqlBuilder.IntegratedSecurity = false;
    sqlBuilder.UserID = userName;
    sqlBuilder.Password = password;
    sqlBuilder.MultipleActiveResultSets = true;

    // Initialize the EntityConnectionStringBuilder.
    EntityConnectionStringBuilder entityBuilder =
        new EntityConnectionStringBuilder();

    entityBuilder.Provider = "System.Data.SqlClient";
    entityBuilder.ProviderConnectionString = sqlBuilder.ToString();

    // Set the Metadata location.
    entityBuilder.Metadata = string.Format("res://*/{0}.csdl|res://*/{0}.ssdl|res://*/{0}.msl",ModelName); 
    return (entityBuilder.ToString().Replace("\"","&quot;"));
}

Il peut être appelé à partir d’un ensemble de paramètres 

GenerateEFConnectionString("srv","db","mod","vinodsrivastav","nopassword");

générer un connection string comme celui-ci 

metadata=res://*/mod.csdl|res://*/mod.ssdl|res://*/mod.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=srv;Initial Catalog=db;User ID=vinodsrivastav;Password=nopassword;MultipleActiveResultSets=True&quot;
0
Vinod Srivastav