我有一个通过实体框架连接到MYSQL数据库的应用程序。它完美地工作,但我想添加一小段代码,在应用程序启动时测试与数据库的连接。测试实体框架数据库连接
我的想法只是简单地向数据库运行一个小命令并捕获任何异常,但是如果出现问题(例如App.Config丢失或数据库服务器关闭),应用程序需要大量时间来运行代码,然后抛出异常(〜1分钟)。我想这是由于连接超时等,但我已摆弄这些属性无济于事。
任何人都可以帮助任何想法去哪里?
我有一个通过实体框架连接到MYSQL数据库的应用程序。它完美地工作,但我想添加一小段代码,在应用程序启动时测试与数据库的连接。测试实体框架数据库连接
我的想法只是简单地向数据库运行一个小命令并捕获任何异常,但是如果出现问题(例如App.Config丢失或数据库服务器关闭),应用程序需要大量时间来运行代码,然后抛出异常(〜1分钟)。我想这是由于连接超时等,但我已摆弄这些属性无济于事。
任何人都可以帮助任何想法去哪里?
你只是想看看数据库连接是否有效。如果是的话就来看看在
using (DatabaseContext dbContext = new DatabaseContext())
{
dbContext.Database.Exists();
}
http://msdn.microsoft.com/en-us/library/gg696617(v=vs.103).aspx EF5 https://msdn.microsoft.com/en-us/library/gg696617(v=vs.113).aspx为EF6
和检查,如果一台服务器机启动之后,DB服务器或Web服务的服务器,试试这个:
public PingReply Send(string hostNameOrAddress)
我通过采取在SQL Server和数据库分贝 '离线' 测试这一点。 Exists()仍然返回true。注意... –
最好的方法是使用mysql dll conector并手动执行。如果您使用迁移,它将返回false,但连接正常! – Daniloloko
这不适用于MS SQL,Exists返回true,并且DBSet.Load同时发出异常。 – Sandor
我将此代码用于我的项目:
private bool TestConnectionEF()
{
using (var db = new SistemaContext())
{
try
{
db.Database.Connection.Open();
if (db.Database.Connection.State == ConnectionState.Open)
{
Console.WriteLine(@"INFO: ConnectionString: " + db.Database.Connection.ConnectionString
+ "\n DataBase: " + db.Database.Connection.Database
+ "\n DataSource: " + db.Database.Connection.DataSource
+ "\n ServerVersion: " + db.Database.Connection.ServerVersion
+ "\n TimeOut: " + db.Database.Connection.ConnectionTimeout);
db.Database.Connection.Close();
return true;
}
return false;
}
catch(Exception ex)
{
throw new Exception(ex.Message + " \n PING: " + TryPing(db.Database.Connection.DataSource).ToString());
}
}
}
什么是TryPing? –
为@Daniloloko该解决方案指出的是调用DbContext.Database.Connection.Open()
它与EF6测试。
我implementaion:
public static bool CheckConnection()
{
try
{
MyContext.Database.Connection.Open();
MyContext.Database.Connection.Close();
}
catch(SqlException)
{
return false;
}
return true;
}
我最喜欢这个解决方案,是的,你不应该使用流逻辑的异常(通常;-)) –
我会将此添加到单元测试。 –
我知道,如果我想确保MySQL服务器在与数据库的每次交互中都处于运行状态,那么我需要为每个单独的操作执行if(CheckConnection()){..}'(为了避免应用程序错误如果MySQL服务器关闭)。任何想法如何在全球范围内实施此检查?所以不需要调用和重新调用CheckConnection()'? –
一件事将是ping服务器,以检查其是否在运行。 – Tauseef
'公共PingReply发送( \t串hostNameOrAddress )' http://msdn.microsoft.com/en-us/library/7hzczzed.aspx – Tauseef