如何以编程方式创建实体框架 6 中的 MS SQL 的连接字符串



如何在实体框架 6 中以编程方式创建到 MS SQL 的连接字符串?

我正在使用 c# 和 WPF,我想知道是否有人可以向我展示如何或将我链接到显示如何在 EF 6 中以编程方式设置连接字符串的资源。MSDN 文章介绍了你可以 http://msdn.microsoft.com/en-us/data/jj680699#moving,但它不会涉及创建实际的连接字符串。

所以这是一个有效的 EF6 示例

应用配置

entityFramework codeConfigurationType="WPFwithEF.SqlConfiguration, WPFwithEF"> /实体框架

上下文

public class ProductContext : DbContext
{  
    public ProductContext():base("Wpf")
    { }
    public DbSet<Category> Categories { get; set; }
    public DbSet<Product> Products { get; set; }
}

配置.cs

namespace WPFwithEF
{
public class SqlConfiguration : DbConfiguration
{
    public SqlConfiguration()
    {
        SetProviderServices(SqlProviderServices.ProviderInvariantName,SqlProviderServices.Instance);           
        SetDefaultConnectionFactory(new SqlConnectionFactory());
    }
}
}

但是,如果上下文库是"name=Wpf",那么这个设置不起作用,有没有办法让它工作?我正在寻找最新的 EF6 而不是旧方法。

您可以使用此处所述的EntityConnectionStringBuilder:如何:生成实体连接连接字符串

如果您专门连接到 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

我之前使用在 app.config(或 web.config)中找到的 DefaultConnection 字符串作为示例,只是将 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

附言。只有在使用代码优先时,才能以这种方式使用它。如果您使用的是 Model-First 或 Database-First,则应使用 EntityConnectionStringBuilder 。

我今天调查了这个问题。 在我看来,上面没有提到最简单的解决方案。

为什么不使用 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";
    }

您可以使用 ProductivityTools.ConnectionString nuget 包。它有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"

最新更新