如何使用EF6更改dbContext上的连接字符串
本文关键字:连接 字符串 dbContext 何使用 EF6 更改 | 更新日期: 2023-09-27 18:03:42
我正在构建一个具有下一个结构的WCF服务应用程序:
WCF客户端->WCF服务->业务层->存储库->EF6
我的应用程序要求服务监听多个客户端,每个客户端都可以从不同的数据库请求数据(相同的模型(。所以客户端使用Connect方法来告诉服务它需要使用哪个数据库。为此,我使用了一个创建连接字符串的类。我的问题是如何告诉上下文更改它的连接字符串。到目前为止,我设法通过如下重写构造函数来解决这个问题:
public partial class OhmioNETEntities : DbContext
{
public OhmioNETEntities() : base(SingleConnection.ConString)
{
}
}
这是有效的,但问题是,如果我刷新模型,这个代码就会丢失,并由替换
public partial class OhmioNETEntities : DbContext
{
public OhmioNETEntities() : base("name=OhmioNETEntities")
{
}
}
有最好的方法吗?谢谢
编辑感谢大家的帮助,但我无法让它发挥作用。根据建议,我添加了一个新的文件,代码如下:
public partial class OhmioNETEntities : DbContext
{
public OhmioNETEntities(string ConString)
{
}
}
当我创建上下文时,我使用:
context = new OhmioNETEntities(SingleConnection.ConString);
并得到这个错误:
{"上下文正以代码优先模式与从EDMX文件生成的用于数据库优先或模型优先开发的代码一起使用。这将无法正常工作。若要解决此问题,请不要删除引发此异常的代码行。如果要使用数据库优先或模型优先,请确保实体框架连接字符串包含在app.config或启动项目的web.config。如果您正在创建自己的DbConnection,请确保它是EntityConnection,而不是其他类型的DbConnection。并将它传递给接受DbConnection的一个基本DbContext构造函数。要了解有关代码优先、数据库优先和模型优先的更多信息,请参阅此处的实体框架文档:http://go.microsoft.com/fwlink/?LinkId=394715"}
知道为什么吗?谢谢
请注意,您的上下文是作为分部类构建的,这意味着您可以添加自己的构造函数。在同一个项目中,添加这个类:
public partial class OhmioNETEntities
{
public OhmioNETEntities(string connectionString) : base(connectionString)
{
}
}
现在,无论你在哪里需要你的上下文,你都可以这样做:
var myContext = new OhmioNETEntities("connection string here");
我们必须在DbContext 中提供实体连接字符串
SqlConnectionStringBuilder sqlString = new SqlConnectionStringBuilder()
{
DataSource = "SOURAV-PC", // Server name
InitialCatalog = "efDB", //Database
UserID = "sourav", //Username
Password = "mypassword", //Password
};
//Build an Entity Framework connection string
EntityConnectionStringBuilder entityString = new EntityConnectionStringBuilder()
{
Provider = "System.Data.SqlClient",
Metadata = "res://*/testModel.csdl|res://*/testModel.ssdl|res://*/testModel.msl",
ProviderConnectionString = sqlString.ToString()
};
return entityString.ConnectionString;
}
我所做的是创建一个新文件,该文件延续了分部类ohmioNETEntities
。在那里,您可以定义一个新的构造函数,该构造函数接受一个字符串param,该字符串param调用基构造函数。
所以,这是你的新文件(在重新生成实体时不会被覆盖(:
public partial class OhmioNETEntities {
public OhmioNETEntities(string connectionstring) : base(connectionstring) {
}
}
这就是分部类的美妙之处(也是代码生成模板在这里使用它们的原因(。你可以安全地保留你自己的逻辑,同时仍然能够生成所有东西。
public class SMISContext : DbContext
{
public SMISContext()
: base("SMISContext")
{
Database.SetInitializer<SMISContext>(null);
}
您可以在web配置中提供您的连接字符串,如下所示
在您的webconfig:
<connectionStrings>
<add name="SMISContext" connectionString="Data source=FARKA-DC'ISIMS;initial catalog=SMISJULY_08; user id=sa; password=1qazXSW@;multipleactiveresultsets=True;App=EntityFramework" providerName="System.Data.SqlClient"/>
感谢大家。我自己找到它,我听从你的所有建议,并根据我的需求进行调整:
public partial class OhmioNETEntities : DbContext
{
public OhmioNETEntities(string ConString) : base(ConString)
{
}
}
创建上下文:
context = new OhmioNETEntities(SingleConnection.ConString);
在inicialize类过程中,插入新的连接字符串。
public OhmioNETEntities() : base(SingleConnection.ConString)
{
base.Database.Connection.ConnectionString = "new connection string here";
}
如果需要,请尝试在SingleConnection.ConString中插入文本变量@password,并在base中替换。Database.Connection.ConnectionString。它工作正常!