【问题标题】:How do I create connection string programmatically to MS SQL in Entity Framework 6?如何在 Entity Framework 6 中以编程方式创建与 MS SQL 的连接字符串?
【发布时间】:2014-03-10 21:34:00
【问题描述】:

如何在 Entity Framework 6 中以编程方式创建与 MS SQL 的连接字符串?

我正在使用 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,而不是旧的方式。

【问题讨论】:

  • 为什么这被否决了?我一直在寻找这些信息。

标签: c# sql-server wpf entity-framework-6


【解决方案1】:

您可以使用此处描述的EntityConnectionStringBuilderHow 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"
    

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 1970-01-01
      • 2022-10-25
      • 1970-01-01
      • 2011-02-27
      • 1970-01-01
      • 2015-06-09
      • 1970-01-01
      • 2023-03-05
      相关资源
      最近更新 更多