2011-03-03 51 views
4

我想以一种方式使用ADO.NET实体数据模型,我可以随时更改我指向的数据库。更改数据库可能需要全新的连接字符串。有些数据库在不同的服务器上。所以我需要能够通过我的ADO.NET实体数据模型一个自定义连接字符串格式化,如'server = severaddress; database = database1; User ID = test; Password = test1234;'如何使用SQL连接字符串与ADO.NET实体数据模型

编辑:我的实体类实现ObjectContext。我可以使用的三个构造函数是默认值,传递给connectionString,传入一个EntityConnection。当我使用重载构造函数时,我收到错误,说它不能识别连接字符串中的“服务器”。

我需要使用自定义连接字符串实例化我的存储库,或者能够在使用前设置它。

回答

6

ObjectContext在其构造函数中接受实体连接字符串。实体连接字符串由三个部分组成:

  • 元数据定位
  • 数据存储提供商
  • 数据存储的连接字符串(由EDMX文件产生的映射个XML的位置)(这是你要提供什么)

你有几种方法来实现你想要的。一般来说,你需要的是结合连接字符串两个部分组成:

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)); 

格式描述元数据的位置,距离Model.edmx包括在组装和SQL提供资源。第二部分是你的连接字符串。

请注意,只有当您的所有数据库具有相同的架构并使用相同的提供程序时,这才会起作用。

+0

@Ladislave这工作,我以为我试过这个,但显然我做了一些错误,当我尝试它。谢谢。 – 2011-03-04 21:46:08

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()) 
     { 
     } 
    } 
} 

这给了你最大的灵活性,当涉及到决定你的上下文将如何实例化。

3

我已经这样做过,只是在自动生成的DbContext派生类的重载构造函数之一中传递连接字符串。

+0

使用上述连接字符串时,我得到的错误说:不支持关键字:“服务器”。我还编辑了我的第一个问题添加更多的信息 – 2011-03-03 19:41:53

+0

杰森正确的连接字符串示例双重检查www.connectionstrings.com – 2011-03-04 08:24:20

0

试试这个:

在web.confige,创建现有的连接字符串的副本,并给它一个不同的名称。更改此新连接字符串的连接字符串属性。例如 如果您以前有一个连接字符串声明为

<add name="MyEntities" connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=MySQL1;initial catalog=MyDB;user id=sa;password=password123;multipleactiveresultsets=True;App=EntityFramework&quot;" 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=&quot;data source=MySQL2;initial catalog=MyDB;user id=sa;password=password987;multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /> 

然后在你的代码文件,添加了“使用System.Data.EntityClient;”命名空间。声明一个entityConnection对象并分配默认服务器。

econn = new EntityConnection("name=MyEntities2"); 

您可以访问第二:

EntityConnection econn = new EntityConnection("name=MyEntities"); 

,你可以用下面的代码

using (var _context = new MyEntities(econn)) 
     { .......} 

在后面的代码,你可以用下面的代码在服务器之间进行切换访问默认数据库DB使用以下代码

using (var _context = new MyEntities(econn)) <== This will point to second server now. 
相关问题