我正在使用EF 5,我需要以某种方式入侵连接创建管道。这是我的情况。在生产中,我在web.config中指定了2个SQL服务器(我对此没有任何控制权)。如果一个连接失败,我需要尝试另一个连接。我再次了解SQL故障转移群集,但就像我说的那样,我无法控制它。
我尝试使用带有DbContext
的{{1}}重载。然后我试着打开连接,看看它是否成功,然后将其传递给EF。问题是EF只想要一个封闭的连接。打开连接然后关闭它似乎真的很开心,只是让EF再次打开它!
有更好的方法吗?
答案 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,并在屏幕上弹出不能保存,因为没有数据库可以保存到。
通过执行此编码,您将保证每次尝试保存到数据库时,只需要对图层类进行一次非常简单的调用即可,即使它不起作用,得到一个漂亮,干净的方式向客户展示它无法连接。