3

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

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);
    }
}


但是在 SqlLite 'In Memory' 数据库(Data Source=:memory:;Version=3;New=True;)上运行此代码时,我得到了这个异常:

未处理的异常: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 测试的


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

4

1 回答 1

8

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

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

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

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

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

于 2013-07-05T09:15:48.583 回答