内存数据库中的SqLite:CREATE TABLE不起作用?

时间:2013-07-04 19:43:52

标签: c# sql entity-framework sqlite

在SqLite文件数据库上使用此代码时,它可以正常工作。

using (var ctx = new Test2010Entities())
{
    string s = "CREATE TABLE 'Company' ([Id] integer PRIMARY KEY AUTOINCREMENT NOT NULL, varchar(50) NOT NULL);";

    ctx.ExecuteStoreCommand(s);

    ctx.Companies.AddObject(new Company { Code = "_1" });
    ctx.Companies.AddObject(new Company { Code = "_2" });

    ctx.SaveChanges();

    foreach (var c in ctx.Companies.ToList())
    {
        Console.WriteLine(c.Code);
    }
}


但是当在SqLite“内存”数据库中运行此代码时(数据源=:内存:;版本= 3;新=真; ),我得到此异常:

  

未处理的异常:System.Data.UpdateException:发生错误   在更新条目时。有关详细信息,请参阅内部异常--->   System.Data.SQLite.SQLiteException:SQL逻辑错误或丢失   数据库没有这样的表:公司

请注意,这是使用VS 2010,EF 4.4.0.0和sqlite-netFx40-setup-bundle-x86-2010-1.0.84.0测试的


::: UPDATE :::
正如Simon Svensson建议的那样,在任何其他命令之前打开连接确实可以解决问题: ctx.Connection.Open();

1 个答案:

答案 0 :(得分:5)

当您的ORM关闭连接并重新打开它时,会发生这种情况。这会将sqlite内存数据库重置为默认状态;即空。

除非你设置connection.release_mode = close(默认为after_transaction,否则NHibernate会发生同样的事情。

我不熟悉Entity Framework,但我希望有类似的设置或使用DataContext(IDbConnection)构造函数,该构造函数记录为“如果提供开放连接,DataContext将不会关闭它。”

相同的文档还指出“在System.Transactions事务中,DataContext不会打开或关闭连接以避免升级。”这可能是一个更清洁的解决方案。

使用一些Reflector魔术表明它是SQLiteConnection.Open,它调用(通过SQLite3.Open)sqlite3_open_interop(如果你使用的是NuGet sqlite包)。这表明每次调用SQLiteConnection.Open时都会获得一个新的空内存数据库。