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

时间:2011-03-03 18:59:53

标签: c# entity-framework

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

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

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

5 个答案:

答案 0 :(得分:7)

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中元数据的位置。第二部分是你的连接字符串。

请注意,只有当所有数据库都具有相同的架构并使用相同的提供程序时,才能使用此功能。

答案 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=&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" />

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