DatabaseExists 失败的 SQLite 操作(.NET 4.0、EF 4.4)

DatabaseExists failing SQLite operations (.NET 4.0, EF 4.4)

我正在使用 .NET 4.0 和 Entity Framework 4.4

我曾经有过多年有效的代码突然卡住了我 - 我完全不知道为什么。我已经将问题代码提炼成一个非常简单的序列。请注意,如果我在磁盘上创建物理文件,代码行为不会改变;它根本不涉及问题。

string sDatabaseFilename = @"c:\users\bob\database.sqlite";
//System.IO.File.Create(sDatabaseFilename).Close();
System.Data.SQLite.SQLiteConnection cConnection = new System.Data.SQLite.SQLiteConnection("DataSource=" + sDatabaseFilename);
System.Data.Entity.DbContext dbContext = new System.Data.Entity.DbContext(cConnection, false);
System.Data.Entity.Database dDatabase = dbContext.Database;

dDatabase.ExecuteSqlCommand("PRAGMA foreign_keys=ON;");

app.config 数据提供者:

  <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />

任何接触 dDatabase(例如上面的 ExecuteSqlCommand)或访问 dbContext.ObjectContext 的尝试都会导致

System.Data.ProviderIncompatibleException occurred
  HResult=-2146232032
  Message=DatabaseExists is not supported by the provider.
  Source=System.Data.Entity
  StackTrace:
       at System.Data.Common.DbProviderServices.DbDatabaseExists(DbConnection connection, Nullable`1 commandTimeout, StoreItemCollection storeItemCollection)
  InnerException: 

我用 v1.0.88 SQLite 的东西工作,然后它停止工作(我在同一个解决方案中的一个单独项目中进行一些 HTML 抓取)。我已经升级到 SQLite v1.0.98 试图解决这个问题,但没有成功。

我没能找出问题所在,但我最终解决了这个问题。

解决方法是创建一个新的解决方案并从原始源文件重新构建项目。我首先创建了一个准系统解决方案来弄清楚我需要什么才能让它工作,然后从那里开始构建。

没有解决问题的事情:

  1. 通过 NuGet 将损坏的解决方案升级到 EF 6.0 和适当的 SQLite。

  2. 将损坏的解决方案的 app.config 和 packages.config 文件与准系统解决方案匹配。

  3. 尝试通过删除与准系统解决方案不匹配的部分来"clean up"损坏解决方案中的项目文件。

无论是什么导致我的旧解决方案出现问题,都在项目文件中的某处,但我从未发现它是什么。请注意,这都是 Visual Studio 2010.

问题的原因是 EF 尝试初始化数据库。 在使用上下文设置为 null 初始化器之前。

Database.SetInitializer<DbContext>(null);