如何将SQL连接字符串与ADO.NET实体数据模型一起使用

我试图以一种方式使用ADO.NET实体数据模型,我可以随时更改我指向的数据库。 更改数据库可能需要一个全新的连接字符串。 某些数据库位于不同的服务器上 所以我需要能够传递我的ADO.NET实体数据模型一个自定义连接字符串,如’server = severaddress; database = database1; User ID = test; Password = test1234;’

编辑:我的实体类实现了ObjectContext。 我可以使用的三个构造函数是默认的,传入connectionString,传入EntityConnection。 当我使用重载构造函数时,我会收到错误,说它无法识别connectionstring中的“server”。

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

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

该格式描述了作为程序集和Sql提供程序中的资源包含的Model.edmx中元数据的位置。 第二部分是你的连接字符串。

请注意,这仅在所有数据库具有相同架构并使用相同提供程序时才有效。

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

实体上下文具有将连接字符串作为参数的构造函数。 我相信你可以提供字符串本身,或者从配置文件中的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()) { ... } 

使用它的理想方法是dependency injection,这样你就不会与new ContextFactory()实现紧密结合:

 public class MyRepository : IMyRepository { private readonly IContextFactory _contextFactory; public MyRepository(IContextFactory contextFactory) { _contextFactory = contextFactory; } public GetObjects() { using(var context = _contextFactory.Get()) { } } } 

在决定如何实例化上下文时,这为您提供了最大的灵活性。

试试这个:

在web.confige中,创建现有连接字符串的副本,并为其指定其他名称。 更改此新连接字符串的连接字符串属性。 例如,如果您之前已将连接字符串声明为

   

添加另一个给它一个新名称

  

然后在您的代码文件中添加“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. 

为了将connectionstring传递给ObjectContext派生类,我从以下链接找到了一个解决方案:

http://blogs.msdn.com/b/rickandy/archive/2008/12/09/explicit-connection-string-for-ef.aspx