Como faço para definir programaticamente a seqüência de conexão para Code-First Entity-Framework?

Eu estou tentando escrever algum código que me permite alternar entre o SQLCE (localmente na minha máquina dev) e SQL completo (no AppHarbor). Com o SQL CE, a string de conexão é toda manipulada para mim, mas eu mesmo tenho que construí-la para SQL. Meu código até agora está abaixo, no entanto, dá esse erro:

Palavra-chave não suportada: “metadados”

Eu tenho procurado on-line por horas, mas todas as soluções envolvem o uso de uma class “ContextBuilder” que não consigo encontrar (instalei o EF por meio do pacote NuGet).

Aqui está o código atual (rodando na boot 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(new BlogDataIntializer()); // Set the connection factory for SQL Compact Edition. Database.DefaultConnectionFactory = new SqlCeConnectionFactory("System.Data.SqlServerCe.4.0"); } } 

você deve usar a class 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(); } 

No Entity-Framework Code-First use SqlConnection. Você não pode usar EntityConnectionStringBuilder porque no código-primeiro não há arquivos de metadados.

Você também pode configurá-lo diretamente no seu contexto. Você precisa append o mdf à instância do SqlServer que deseja usar primeiro. Não exatamente elegante, mas funcionou para mim

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

como sempre, o EF gerará tudo automaticamente quando você adicionar sua primeira linha ao contexto.