【问题标题】:HOW TO: dynamic connection string for entity frameworkHOW TO:实体框架的动态连接字符串
【发布时间】:2014-09-30 11:33:02
【问题描述】:

喜欢标题。我该怎么做?

我尝试了一些东西,但它没有像我预期的那样工作。

我正在使用实体框架模型。我需要像参数一样传递我的连接字符串,所以,在另一个文件中,我已经写了

namespace MyNamespace.Model
{
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;

    public partial class MyEntities: DbContext
    {
        public MyEntities(string nameOrConnectionString) : base(nameOrConnectionString)
        {

        }
    }
}

当我启动应用程序时,我以这种方式调用这个构造函数,所以我可以在应用程序中引用这个:

public static MyEntities dbContext = new MyEntities(mdlImpostazioni.SetConnectionString());

其中 mdlImpostazioni.SetConnectionString() 返回一个字符串(数据正确):

server=192.168.1.100\SVILUPPO;database=MyDB;uid=myName;pwd=111111;

当我执行这段代码时,似乎一切正常,但是当我尝试进行如下查询时:

var query = (from r in MainWindow.dbContext.TabTipoSistema select r);

它从这里抛出一个异常:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    throw new UnintentionalCodeFirstException(); //exception here
}

所以,这是一个不好的方法......哪个是正确的? (仅使用代码 C#,而不是来自 xaml)

【问题讨论】:

  • 连接字符串是否正确?我以前从未见过这样的 conn 字符串。
  • 我想是的。此外,字符串中的数据是正确的......我不知道我哪里错了!
  • 这种方式没有错,只是不完整。快到了……

标签: c# wpf database entity-framework connection


【解决方案1】:

您的方法是正确的,但您需要记住 EF 的连接字符串需要元数据等。所以使用EntityConnectionStringBuilder。例如:

// the model name in the app.config connection string (any model name - Model1?)
private static string GetConnectionString(string model, YourSettings settings)
{
    // Build the provider connection string with configurable settings
    var providerSB = new SqlConnectionStringBuilder
    {
        // You can also pass the sql connection string as a parameter instead of settings
        InitialCatalog = settings.InitialCatalog,
        DataSource = settings.DataSource,
        UserID = settings.User,
        Password = settings.Password
    };

    var efConnection = new EntityConnectionStringBuilder();
    // or the config file based connection without provider connection string
    // var efConnection = new EntityConnectionStringBuilder(@"metadata=res://*/model1.csdl|res://*/model1.ssdl|res://*/model1.msl;provider=System.Data.SqlClient;");
    efConnection.Provider = "System.Data.SqlClient";
    efConnection.ProviderConnectionString = providerSB.ConnectionString;
    // based on whether you choose to supply the app.config connection string to the constructor
    efConnection.Metadata = string.Format("res://*/Model.{0}.csdl|res://*/Model.{0}.ssdl|res://*/Model.{0}.msl", model); ;
    return efConnection.ToString();

}
// Or just pass the connection string
private static string GetConnectionString(string model, string providerConnectionString)
{

    var efConnection = new EntityConnectionStringBuilder();
    // or the config file based connection without provider connection string
    // var efConnection = new EntityConnectionStringBuilder(@"metadata=res://*/model1.csdl|res://*/model1.ssdl|res://*/model1.msl;provider=System.Data.SqlClient;");
    efConnection.Provider = "System.Data.SqlClient";
    efConnection.ProviderConnectionString = providerConnectionString;
    // based on whether you choose to supply the app.config connection string to the constructor
    efConnection.Metadata = string.Format("res://*/Model.{0}.csdl|res://*/Model.{0}.ssdl|res://*/Model.{0}.msl", model);
    // Make sure the "res://*/..." matches what's already in your config file.
    return efConnection.ToString();

}

编辑

您得到的异常是因为当您传递纯 SQL 连接字符串时,它假定您首先使用代码,因此它调用 OnModelCreation 事件。当您包含如上所示的 MetaData 部分时,它告诉 EF 它是一个完整的 EF 连接字符串。

【讨论】:

  • 我该如何调用这个 GetConnectionString?我把什么作为模型和设置的参数?
  • 您可以使用提供程序 (SQL) 连接字符串或您自己的设置文件来构建它
  • 我已经删除了“设置”参数并传递了我的模型的名称......它可以工作!!!!!!非常感谢!!!!! :)
【解决方案2】:

我认为问题出在您指定的数据源上。您需要添加连接的端口,例如,如果您的 SQL Server 配置为端口 1433,请尝试:

server=192.168.1.100,1433\SVILUPPO;database=MyDB;uid=myName;pwd=111111;

有关连接字符串的更多详细信息,您可以找到Here

我也不确定uidpwd是否有效,最好试试User IDPassword

 Server=192.168.1.100,1433\SVILUPPO;Database=MyDB;User ID=myName;Password=111111;

最后要注意区分大小写。

【讨论】:

  • 端口的参数名称是什么?只是“端口”?
  • 你只需在IP后面添加端口,用逗号(,)分隔,如我的回答所示
  • 不幸的是没有...我使用了与您的答案相同的语法,但它会引发与以前相同的错误...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-04
相关资源
最近更新 更多