我使用下一个结构构建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时,我使用:
context = new OhmioNETEntities(SingleConnection.ConString);
并收到此错误:
{"上下文正在Code First模式中使用,该代码是从EDMX文件生成的用于Database First或Model First开发的代码。这将无法正常工作。要解决此问题,请不要删除引发此异常的代码行。如果您希望使用Database First或Model First,请确保Entity Framework连接字符串包含在启动项目的app.config或web.config中。如果要创建自己的DbConnection,请确保它是EntityConnection而不是其他类型的DbConnection,并将其传递给采用DbConnection的基本DbContext构造函数之一。要了解有关Code First,Database First和Model First的更多信息,请参阅此处的实体框架文档:http://go.microsoft.com/fwlink/?LinkId=394715"}
任何想法为什么?谢谢!
答案 0 :(得分:1)
请注意,您的上下文构建为partial class,这意味着您可以添加自己的构造函数。在同一个项目中,添加以下类:
public partial class OhmioNETEntities
{
public OhmioNETEntities(string connectionString) : base(connectionString)
{
}
}
现在,只要您需要上下文,就可以执行此操作:
var myContext = new OhmioNETEntities("connection string here");
答案 1 :(得分:1)
我们必须在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;
}
答案 2 :(得分:0)
我所做的是创建一个继续部分类ohmioNETEntities
的新文件。在那里,您可以定义一个新的构造函数,该构造函数接受一个字符串参数,该参数调用基本构造函数。
所以 - 这是你的新文件(在重新生成实体时不会被覆盖):
public partial class OhmioNETEntities {
public OhmioNETEntities(string connectionstring) : base(connectionstring) {
}
}
这是部分类的优点(以及代码生成模板在这里使用它们的原因)。您可以安全地保留自己的逻辑,同时仍能生成所有内容。
答案 3 :(得分:0)
public class SMISContext : DbContext
{
public SMISContext()
: base("SMISContext")
{
Database.SetInitializer<SMISContext>(null);
}
您可以在网络配置中提供连接字符串,如下所示
你的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"/>
答案 4 :(得分:0)
感谢大家。自己找,我会根据您的所有建议并根据我的需求进行调整:
public partial class OhmioNETEntities : DbContext
{
public OhmioNETEntities(string ConString) : base(ConString)
{
}
}
创建上下文:
context = new OhmioNETEntities(SingleConnection.ConString);
答案 5 :(得分:0)
在inicialize类过程中,插入新的连接字符串。
public OhmioNETEntities() : base(SingleConnection.ConString)
{
base.Database.Connection.ConnectionString = "new connection string here";
}
如果需要,请尝试在SingleConnection.ConString中插入文本变量@password,并替换为base.Database.Connection.ConnectionString。它工作正常!