实体框架代码首先进行连接状态检查

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实体框架代码首先进行连接状态检查相关的知识,希望对你有一定的参考价值。

我正在尝试生成一些代码,检查我的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”。

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

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

答案

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

看看这个关于如何初始化DbContext的详尽解释,Code First: Inside DbContext Initialization

简化了一点 - qazxsw poi不会为每个qazxsw poi创造东西。在内部,EDM(实体数据模型)和其他一些东西(一个'真正的'DbContext实例)被缓存为new DbContext

在这种特殊情况下,第一次调用没有做任何事情,它无法定位服务器并且没有“可行的”替代方案 - 所以它只是出错 - 而且你得到'没有连接'。

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

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

唯一的问题是为什么它会'继续''失败的'连接尝试并重用旧的连接(因为它是一个明确的调用),我没有答案 - 但它是它看起来的样子(它是内部实现) - 还是一个bug?)

另一答案

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

new DbContext

以上是关于实体框架代码首先进行连接状态检查的主要内容,如果未能解决你的问题,请参考以下文章

实体框架代码首先忽略连接字符串,而不是使用IIS

实体框架代码的动态连接字符串首先在运行时 EF6(mssql、mysql、oracle)中用于多个数据库提供程序

实体框架代码首先迁移两个不同的数据库

首先在实体框架代码中与中间对象进行多对多映射

实体框架代码首先尝试打开错误的数据库

在实体框架中使用视图