Подтвердить что ты не робот

Как создать строку соединения программно в MS SQL в Entity Framework 6?

Как создать программную строку подключения к 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, а не старый способ сделать это.

4b9b3361

Ответ 2

Если вы специально подключаетесь к базе данных 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());
            }
        }
    }

}

см. https://msdn.microsoft.com/en-Us/library/system.data.sqlclient.sqlconnectionstringbuilder%28v=vs.100%29.aspx

Ответ 3

Ранее я использовал строку 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.

Ответ 4

Вы можете использовать пакет Nuget ProductivityTools.ConnectionString. Есть 3 метода:

  • Создает строку подключения к серверу без имени базы данных
  • Создает строку подключения к серверу с именем базы данных
  • Создает строку подключения для контекста базы данных EntityFramework

Последний метод будет правильным для вас, и предполагается, что ваш 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"

Ответ 5

Я исследовал этот вопрос сегодня. На мой взгляд, самое простое решение не упомянуто выше.

Почему бы не использовать класс 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";
    }