2012-04-20 134 views
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”。

就是这样!我不知道背景中发生了什么以及如何控制。

发生了什么,我该如何解决这个问题?

回答

0

这是一种预期的行为,我认为(至少部分)的,据我了解(和短的进入反射器)

在此详尽的解释看一看的DbContext如何初始化, Code First: Inside DbContext Initialization

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

在这种特殊情况下,第一次调用什么都不做,它无法定位服务器,也没有“可行的”选择 - 所以它只是出错 - 而且你会得到“无连接”。

在下一个阶段,它成功并初始化了其中的一些数据(AppDomain是'全局' - 在大多数情况下意味着您的应用程序) - 'new DbContext'几乎没有任何作用,但在首次使用时,在你的情况下,'Exists'它不会创建Db,但会进行一些初始化(看似)。

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

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

+0

嘿,那里,谢谢你的帮助。我将文章“代码优先:内部DbContext初始化” - 但不幸的是我没有得到如何解决我的问题的信息;)任何人在这里谁可以给我一些其他的提示? – CodeCannibal 2012-04-23 06:57:28