3

我正在使用 EF 5,我需要以某种方式侵入连接创建管道。这是我的情况。在生产中,我们在 web.config 中指定了 2 个 SQL 服务器(我对此没有任何控制权)。如果一个连接失败,我需要尝试另一个。再一次,我知道 SQL 故障转移集群,但就像我说的,我无法控制它。

我尝试使用DbContext需要DbConnection. 然后我尝试自己打开连接,看看是否成功,然后将其传递给 EF。那里的问题是 EF 只想要一个关闭的连接。打开一个连接,然后关闭它,只是让 EF 再次打开它,这似乎真的很糟糕!

有没有更好的办法??

4

1 回答 1

1

如果在 Web.config 文件中指定了两个连接,则应使用DbContext 类的此重载。您需要做的就是传递在<connectionStrings>您尝试连接的记录中找到的名称,它将进入 Web.config 文件,获取该连接字符串,然后打开连接。

一个示例(使用带有 SQLEXPRESS 的普通本地主机——很容易转换为您的进程)

 <connectionStrings>
    <add name="Connection1" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog = FirstDB;Integrated Security=True" providerName="System.Data.SqlClient;MultipleActiveResultSets=true;" />
    <add name="Connection2" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog = SecondDB;Integrated Security=True" providerName="System.Data.SqlClient;MultipleActiveResultSets=true;" />
 </connectionStrings>

然后在您的 DbContext 类中存在以下构造函数:

public MyDbContext(string connectionString) : base(connectionString)
{

}

connectionString“Connection1”或“Connection2”在哪里。

编辑:根据评论,我认为您需要在您的 DbContext 上创建一个图层,该图层将为您简单地进行切换。您可能需要考虑执行以下步骤:

1) 创建一个具有 DbContext 对象的类(我们称之为 ContextLayer)。这个类是否是静态的取决于你。您可能还想让它实现 IDisposable。

2) 在该项目的 Web.Config 文件中,确保为您可能连接的所有数据库都有一个连接字符串条目。

3) 在层类上有一个方法,该方法将为您提供 DbContext 对象,使用在您的配置文件中找到的第一个连接字符串。作为替代方案,您还可以将您的层放入存储库本身,该存储库本身将 DbContext 对象作为私有字段,并仅公开存储库方法以获取特定信息。

4) 在这个层类中,有一个返回 int 的 SaveChanges() 方法,就像 DbContext.SaveChanges() 一样。在 SaveChanges() 内部检查连接是否良好。否则,使用 DbContext 类的新实例(与当前类中的对象不同的对象)检查 Web.Config 文件中的每个其他连接字符串条目并测试它们。如果其中一个有效,请执行所有逻辑以将更改放在另一个 DbContext 类上。如果您决定将其设为静态类,则可能需要将类上的 DbContext 对象设置为此上下文,具体取决于您的需要。

5) 如果所有上下文都不起作用,则可能让方法返回 -1,并在屏幕上弹出无法保存的信息,因为找不到要保存的数据库。

通过执行此编码一次,您将保证每次尝试保存到数据库时,您只需要对图层类进行 1 次非常简单的调用即可,即使它不起作用,您也会得到一个不错的,干净的方式向客户端显示它无法连接。

于 2013-01-07T20:37:53.503 回答