0

我正在尝试生成一些代码来检查我的 SQL 服务器是否可连接。并且:如果是这样,那么它应该检查数据库是否存在。让我通过代码解释一下。

这是我的主要方法:

private static void Main(string[] args)
        {
            Database.SetInitializer<MyDbContext>(new DropCreateDatabaseAlways<MyDbContext>());
            Console.WriteLine(CheckIfDatabaseExists("Data Source=127.0.0.1\\SQLEXPRESS2;Initial Catalog=SQLTest;Integrated Security=True;Connect Timeout=3"));
            Console.WriteLine(CheckIfDatabaseExists("Data Source=127.0.0.1\\SQLEXPRESS;Initial Catalog=SQLTest;Integrated Security=True;Connect Timeout=3"));
            Console.WriteLine(CheckIfDatabaseExists("Data Source=127.0.0.1\\SQLEXPRESS2;Initial Catalog=SQLTest;Integrated Security=True;Connect Timeout=3"));
        }

您可以想象:我的本地 SQL 服务器“SQLEXPRESS”上有一个现有的数据库“SQLTest”。但是:没有像 'SQLEXPRESS2' 这样的服务器!

好的 - 更多代码。这是我的检查方法:

public static DatabaseExistsStatus CheckIfDatabaseExists(String connString)
        {
          try
            {

                using (var db = new MyDbContext(connString))
                {
                    bool DbExists = db.Database.Exists();
                    if (DbExists)
                    {
                        // database is existing
                        return DatabaseExistsStatus.EXISTING;
                    }
                    else
                    {
                        // config is working, but database does not exist
                        return DatabaseExistsStatus.NO_DB;
                    }
                }
            }
            catch (Exception)
            {
                // no working config
                return DatabaseExistsStatus.NO_CONNECTION;
            }
        }

        public enum DatabaseExistsStatus
        {
            EXISTING,
            NO_CONNECTION,
            NO_DB
        }

启动我的应用程序会带来以下结果:

NO_CONNECTION
EXISTING 
NO_DB

我很困惑!我期待 "NO_CONNECTION, EXISTING, NO_CONNECTION" 。

就是这样!我不知道后台发生了什么以及如何获得控制权。

那里发生了什么,我该如何解决?

4

2 回答 2

0

据我所知,这是我认为(至少部分)的一种预期行为(并且没有进入反射器)

看看这个关于如何初始化 DbContext 的详尽解释,代码优先:内部 DbContext 初始化

简化了一点 -DbContext不会为每个重新创建东西new DbContext。在内部,EDM(实体数据模型)和其他一些东西(“真实”ObjectContext实例)被缓存为AppDomain.

在这种特殊情况下,第一次调用什么都不做,它无法找到服务器并且没有“可行的”替代方案 - 所以它只是出错 - 你会得到“没有连接”。

在下一次通过时,它成功并初始化了内部的一些数据(对于 AppDomain 来说是“全局的”——在大多数情况下意味着你​​的应用程序)——非常 ' new DbContext' 几乎什么都不做,但在第一次使用时,在你的情况下 ' Exists' 它不会创建 Db,但会进行一些初始化(看似)。

在最后一次通过时,它尝试打开一个连接,但失败了 - 但它已经有一个有效的连接,可以从它拥有的已经初始化的数据中重用。

唯一的问题是为什么它会在“失败”的连接尝试上“继续”并重用旧的连接尝试(因为它是一个明确的调用),我对此没有答案 - 但它看起来就是这样(它是内部实现- 还是错误?)。

于 2012-04-20T16:00:04.977 回答
0

您可以使用此代码控制连接状态

var db = new MyDbContext(connString));
if (db.Database.Connection.State == System.Data.ConnectionState.Open)
{
    // do something
}
于 2018-09-01T11:40:24.090 回答