覆盖实体框架连接逻辑

时间:2013-01-07 20:32:57

标签: c# entity-framework entity-framework-5

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

我尝试使用带有DbContext的{​​{1}}重载。然后我试着打开连接,看看它是否成功,然后将其传递给EF。问题是EF只想要一个封闭的连接。打开连接然后关闭它似乎真的很开心,只是让EF再次打开它!

有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

如果在Web.config文件中指定了两个连接,则应使用DbContext类的this overload。您需要做的就是传入您尝试连接的<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)创建一个类(让我们称之为ContextLayer),它上面有一个DbContext对象。这个类是否是静态的取决于你。您也可能希望它实现IDisposable。

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

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

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

5)如果没有任何上下文工作,可能让方法返回-1,并在屏幕上弹出不能保存,因为没有数据库可以保存到。

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