我正在尝试使用ADO.NET实体数据模型,我可以随时更改我指向的数据库。更改数据库可能需要一个全新的连接字符串。某些数据库位于不同的服务器上所以我需要能够传递我的ADO.NET实体数据模型一个自定义连接字符串,如'server = severaddress; database = database1; User ID = test; Password = test1234;'
已编辑:我的实体类实现了ObjectContext。我可以使用的三个构造函数是默认的,传入connectionString,传入EntityConnection。当我使用重载构造函数时,我会收到错误,说它无法识别连接字符串中的“server”。
我需要使用自定义连接字符串实例化我的存储库,或者能够在使用之前设置它。
答案 0 :(得分:7)
ObjectContext在其构造函数中接受实体连接字符串。实体连接字符串由三部分组成:
你有几种方法可以达到你想要的效果。通常您需要的是组合连接字符串的两个部分:
string format = "metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlClient;provider connection string=\"{0}\"";
string connectionString = "server=severaddress;database=database1;UserID=test;Password=test1234;"
var context = ModelContext(String.Format(format, connectionString));
格式描述了作为程序集和Sql提供程序中的资源包含的Model.edmx中元数据的位置。第二部分是你的连接字符串。
请注意,只有当所有数据库都具有相同的架构并使用相同的提供程序时,才能使用此功能。
答案 1 :(得分:3)
实体上下文具有将连接字符串作为参数的构造函数。我相信您可以提供字符串本身,也可以提供配置文件中connectionStrings
元素的字符串名称。
所以诀窍是避免通过说new EntityContext()
来创建你的上下文。一种简单的方法是使用工厂。
public class ContextFactory : IContextFactory
{
public EntityContext Get()
{
var connectionString = ... // Do some logic to get the connection string
return new EntityContext(connectionString);
}
}
...
using (var context = new ContextFactory().Get())
{
...
}
使用它的理想方法是依赖注入,这样你就不会与new ContextFactory()
实现紧密结合:
public class MyRepository : IMyRepository
{
private readonly IContextFactory _contextFactory;
public MyRepository(IContextFactory contextFactory)
{
_contextFactory = contextFactory;
}
public GetObjects()
{
using(var context = _contextFactory.Get())
{
}
}
}
在决定如何实例化上下文时,这为您提供了极大的灵活性。
答案 2 :(得分:3)
之前我已经完成了这个,只需在自动生成的DbContext派生类的重载构造函数之一中传递连接字符串。
答案 3 :(得分:0)
试试这个:
在web.confige中,创建现有连接字符串的副本并为其指定其他名称。更改此新连接字符串的连接字符串属性。例如 如果您之前有一个声明为
的连接字符串 <add name="MyEntities" connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlClient;provider connection string="data source=MySQL1;initial catalog=MyDB;user id=sa;password=password123;multipleactiveresultsets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
添加另一个给它一个新名称
<add name="MyEntities2" connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlClient;provider connection string="data source=MySQL2;initial catalog=MyDB;user id=sa;password=password987;multipleactiveresultsets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
然后在您的代码文件中添加“using System.Data.EntityClient;”命名空间。声明entityConnection对象并分配默认服务器。
EntityConnection econn = new EntityConnection("name=MyEntities");
您可以使用以下代码访问默认数据库
using (var _context = new MyEntities(econn))
{ .......}
稍后在代码中,您可以使用以下代码在服务器之间切换:
econn = new EntityConnection("name=MyEntities2");
您可以使用以下代码访问第二个数据库
using (var _context = new MyEntities(econn)) <== This will point to second server now.
答案 4 :(得分:0)
为了将connectionstring传递给ObjectContext派生类,我从以下链接找到了一个解决方案:
http://blogs.msdn.com/b/rickandy/archive/2008/12/09/explicit-connection-string-for-ef.aspx