如何在 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 模型

如何在 Entity Framework 6.1 中仅加载子对象的某些字段?

如何在 Entity Framework 6 DbContext.Database.BeginTransaction 中配置事务超时?

在 Entity Framework 6.1(非核心)中,如何使用 IndexAttribute 来定义聚集索引?

如何在 .Net Core 6.0 中结合 CosmosDB、Entity Framework 和 OData?