Ответ 1
Вы можете использовать EntityConnectionStringBuilder
как описано здесь: Как создать строку подключения EntityConnection
Как создать программную строку подключения к MS SQL в Entity Framework 6?
Я использую С# и WPF, и мне было интересно, может ли кто-нибудь показать мне, как или связать меня с ресурсом, который показывает, как настраивать строки подключения программно в EF 6. В статье MSDN объясняется, что вы можете http://msdn.microsoft.com/en-us/data/jj680699#moving, но он не вступает в создание фактических строк подключения.
Итак, вот пример EF6, который работает
App.Config
entityFramework codeConfigurationType = "WPFwithEF.SqlConfiguration, WPFwithEF" > /EntityFramework
Контекст
public class ProductContext : DbContext
{
public ProductContext():base("Wpf")
{ }
public DbSet<Category> Categories { get; set; }
public DbSet<Product> Products { get; set; }
}
Configuration.cs
namespace WPFwithEF
{
public class SqlConfiguration : DbConfiguration
{
public SqlConfiguration()
{
SetProviderServices(SqlProviderServices.ProviderInvariantName,SqlProviderServices.Instance);
SetDefaultConnectionFactory(new SqlConnectionFactory());
}
}
}
но если база контекстов "name = Wpf", то эта настройка не работает, есть ли способ сделать эту работу? И я ищу последний EF6, а не старый способ сделать это.
Вы можете использовать EntityConnectionStringBuilder
как описано здесь: Как создать строку подключения EntityConnection
Если вы специально подключаетесь к базе данных MS Sql, это должно работать:
private DbConnection CreateConnection(string connectionString)
{
return new SqlConnection(connectionString);
}
private string CreateConnectionString(string server, string databaseName, string userName, string password)
{
var builder = new SqlConnectionStringBuilder
{
DataSource = server, // server address
InitialCatalog = databaseName, // database name
IntegratedSecurity = false, // server auth(false)/win auth(true)
MultipleActiveResultSets = false, // activate/deactivate MARS
PersistSecurityInfo = true, // hide login credentials
UserID = userName, // user name
Password = password // password
};
return builder.ConnectionString;
}
как использовать:
public void ConnectoToDbWithEf6()
{
using(var connection = CreateConnection(CreateConnectionString("server", "db", "you", "password")
{
using(var context = new YourContext(connection, true))
{
foreach(var someEntity in context.SomeEntitySet)
{
Console.WriteLine(someEntity.ToString());
}
}
}
}
Ранее я использовал строку DefaultConnection, найденную в файле app.config(или web.config), и только что заменил "connectionstring" в DbContext, на тот, который мне нужен.
Строка соединения выглядела примерно так:
Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\aspnet-ShoppingList.Web-20150903103641.mdf;Initial Catalog=aspnet-ShoppingList.Web-20150903103641;Integrated Security=True
Если я правильно помню, вы должны заменить строку соединения в:
DbContext.Database.Connection.Connectionstring
PS. Вы можете использовать его только в том случае, если используете Code-First. Если вы используете Model-First или Database-First, вы должны использовать EntityConnectionStringBuilder.
Вы можете использовать пакет Nuget ProductivityTools.ConnectionString. Есть 3 метода:
Последний метод будет правильным для вас, и предполагается, что ваш edmx называется Product после вызова
ConnectionStringHelper.ConnectionString.GetSqlEntityFrameworkConnectionString
("serverName", "databaseName", "Product");
Пакет вернется:
metadata=res://*/Product.csdl|res://*/Product.ssdl| res://*/Product.msl;
provider=System.Data.SqlClient;provider connection string="Data Source=serverName;
Initial Catalog=databaseName;Integrated Security=True"
Я исследовал этот вопрос сегодня. На мой взгляд, самое простое решение не упомянуто выше.
Почему бы не использовать класс SqlConnectionStringBuilder? (используя System.Data.SqlClient)
Вот простой пример, как его использовать.
SqlConnectionStringBuilder sqlb = new SqlConnectionStringBuilder(getConnectionString(DATABASENAME);
using (SqlConnection connection = new SqlConnection(sqlb.ConnectionString))
...
)
// works for EF Core, should also work for EF6 (haven't tried this)
private static string getConnectionString(string databaseName)
{
return "Data Source=SQLSERVERNAME;Initial Catalog="+databaseName+";Integrated Security=True";
}