如何在实体框架 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"