如何在 Entity Framework 6 中以编程方式创建与 MS SQL 的连接字符串?
Posted
技术标签:
【中文标题】如何在 Entity Framework 6 中以编程方式创建与 MS SQL 的连接字符串?【英文标题】:How do I create connection string programmatically to MS SQL in Entity Framework 6? 【发布时间】:2014-03-10 21:34:00 【问题描述】:我正在使用 c# 和 WPF,我想知道是否有人可以向我展示如何或将我链接到显示如何在 EF 6 中以编程方式设置连接字符串的资源。MSDN 文章解释说您可以 http://msdn.microsoft.com/en-us/data/jj680699#moving 但是它不会创建实际的连接字符串。
所以这是一个有效的 EF6 示例
App.Config
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,而不是旧的方式。
【问题讨论】:
为什么这被否决了?我一直在寻找这些信息。 【参考方案1】:您可以使用此处描述的EntityConnectionStringBuilder
:How to: Build an EntityConnection Connection String
【讨论】:
你提到的文章很好,但不是真正的上下文。如何为我的数据上下文设置连接字符串?【参考方案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
【讨论】:
@Payton:嗯,你的评论肯定更有帮助。需要详细说明吗?【参考方案3】:我之前使用 app.config(或 web.config)中的 DefaultConnection 字符串作为示例,只是将 DbContext 上的“connectionstring”替换为我想要的。
连接字符串看起来像:
Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\aspnet-ShoppingList.Web-20150903103641.mdf;Initial Catalog=aspnet-ShoppingList.Web-20150903103641;Integrated Security=True
如果我没记错的话,你应该替换连接字符串:
DbContext.Database.Connection.Connectionstring
附言。如果您使用 Code-First,则只能以这种方式使用它。如果您使用的是模型优先或数据库优先,则应使用 EntityConnectionStringBuilder 。
【讨论】:
正是我需要的。谢谢你【参考方案4】:我今天调查了这个问题。在我看来,上面没有提到最简单的解决方案。
为什么不使用 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";
【讨论】:
【参考方案5】:您可以使用ProductivityTools.ConnectionString nuget 包。它有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"
【讨论】:
以上是关于如何在 Entity Framework 6 中以编程方式创建与 MS SQL 的连接字符串?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Entity Framework 6 中使用 DbDataReader 获取表名?
如何在 Entity Framework 6.1 中仅加载子对象的某些字段?
如何在 Entity Framework 6 DbContext.Database.BeginTransaction 中配置事务超时?