C# 如何:实体框架的动态连接字符串
我喜欢这个标题。我怎么做 我试过一些东西,但它不像我期望的那样工作 我使用的是实体框架模型。我需要像参数一样传递我的连接字符串,因此,在另一个文件中,我编写了C# 如何:实体框架的动态连接字符串,c#,wpf,database,entity-framework,connection,C#,Wpf,Database,Entity Framework,Connection,我喜欢这个标题。我怎么做 我试过一些东西,但它不像我期望的那样工作 我使用的是实体框架模型。我需要像参数一样传递我的连接字符串,因此,在另一个文件中,我编写了 namespace MyNamespace.Model { using System; using System.Data.Entity; using System.Data.Entity.Infrastructure; public partial class MyEntities: DbContext
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()返回一个字符串(数据正确):
当我执行此代码时,似乎一切正常,但当我尝试进行如下查询时:
var query = (from r in MainWindow.dbContext.TabTipoSistema select r);
它从这里抛出一个异常:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException(); //exception here
}
所以,这是一个糟糕的方式。。。哪个是正确的?(仅使用代码C#,而不是来自xaml)我认为问题在于您指定的数据源。您需要添加连接端口,例如,如果SQL Server配置在端口1433上,请尝试:
server=192.168.1.100,1433\SVILUPPO;database=MyDB;uid=myName;pwd=111111;
有关连接字符串的更多详细信息,请参见
另外,我不确定uid
和pwd
是否有效,最好尝试User ID
和Password
:
Server=192.168.1.100,1433\SVILUPPO;Database=MyDB;User ID=myName;Password=111111;
最后请注意区分大小写。我认为问题在于您指定的数据源。您需要添加连接端口,例如,如果SQL Server配置在端口1433上,请尝试:
server=192.168.1.100,1433\SVILUPPO;database=MyDB;uid=myName;pwd=111111;
有关连接字符串的更多详细信息,请参见
另外,我不确定uid
和pwd
是否有效,最好尝试User ID
和Password
:
Server=192.168.1.100,1433\SVILUPPO;Database=MyDB;User ID=myName;Password=111111;
最后要注意区分大小写。您的方法是正确的,但是您需要记住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事件。当您包含如上所示的元数据部分时,这会告诉EF它是一个完整的EF连接字符串。您的方法是正确的,但是您需要记住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事件。当您包含如上所示的元数据部分时,这会告诉EF它是一个完整的EF连接字符串。连接字符串正确吗?我以前从来没有见过这样的控制线,我想是的。此外,字符串中的数据是正确的。。。我不知道我哪里出错了!这样没有什么不对,只是不完整。差不多了…连接字符串正确吗?我以前从来没有见过这样的控制线,我想是的。此外,字符串中的数据是正确的。。。我不知道我哪里出错了!这样没有什么不对,只是不完整。快到了…端口的参数名是什么?简单的“端口”?您只需在IP后面添加端口,并用逗号(,)分隔,如我的回答所示。不幸的是,没有。。。我使用了与您的答案相同的语法,但它抛出了与以前相同的错误…端口的参数名称是什么?简单的“端口”?您只需在IP后面添加端口,并用逗号(,)分隔,如我的回答所示。不幸的是,没有。。。我使用了与您的答案相同的语法,但它抛出了与以前相同的错误…我如何调用此GetConnectionString?我为模型和设置设置了哪些参数?您可以使用提供程序(SQL)连接字符串或您自己的设置文件来构建它。我已删除“设置”参数并传递了模型的名称。。。而且很有效!!!!!非常感谢我该怎么称呼这个GetConnectionString呢?我为模型和设置设置了哪些参数?您可以使用提供程序(SQL)连接字符串或您自己的设置文件来构建它。我已删除“设置”参数并传递了模型的名称。。。而且很有效!!!!!非常感谢