c# - 内存数据库中的 SqlLite : CREATE TABLE does not work?

标签 c# sql entity-framework sqlite

在 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;) 上运行此代码时,我收到此异常:

Unhandled Exception: System.Data.UpdateException: An error occurred while updating the entries. See the inner exception for details. ---> System.Data.SQLite.SQLiteException: SQL logic error or missing database no such table: Company

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


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

最佳答案

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

除非你设置 connection.release_mode = close(默认是 after_transaction

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

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

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

关于c# - 内存数据库中的 SqlLite : CREATE TABLE does not work?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17477246/

相关文章:

mysql - 有没有办法在mysql数据库中插入一个带前缀的自增主ID?

c# - Entity Framework 模型优先设计中的存储库模式

c# - DbSet<TEntity>.Find() - 反射

c# - c# 中可缩放、可打印、可滚动的火车运动图

c# - 如何将经过身份验证的用户更改为 Google Drive API

c# - 构建字符串时如何保持上一行的缩进

c# - Azure DocumentDb - 查询空间数据

mysql - 获取特定日期的两个不同列的唯一值

sql - 从三个表的相同列的联合中选择

sql-server - 向SQL Server插入数据会锁定整个表吗?