You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Entity Framework Core使用内存SQLite时无法生成数据表问题排查求助

问题1:information_schema.tables不存在报错

SQLite本身没有SQL Server的information_schema系统表,你这行查询是SQL Server专属语法,在SQLite下无法执行。如果没有强需求直接删掉这行即可,要查询SQLite的表列表可以用SELECT name FROM sqlite_master WHERE type='table'替代。


问题2:迁移/操作时找不到已创建的表的核心原因

SQLite的内存模式默认是连接级别的:当一个连接打开时内存库被创建,连接关闭后整个内存库的所有数据、表结构都会被立刻销毁。EF Core默认会对每次数据库操作自动打开/关闭连接,这就导致:

  1. 你观测到的创建表SQL是第一次连接打开时执行的
  2. 执行完创建操作后连接自动关闭,整个内存库被清空
  3. 下一次操作(比如查询迁移历史表、操作业务表)时EF Core新开了连接,对应一个全新的空内存库,自然找不到任何表

具体解决步骤

  • 第一步:保持内存SQLite的连接持续打开
    你需要手动创建一个SQLite连接,在整个测试生命周期内保持打开状态,再把这个连接传给DbContext使用,不要让EF Core自己管理连接:
// 测试类里提前初始化静态连接,整个测试生命周期保持打开
private static readonly SqliteConnection _testDbConnection = new SqliteConnection("Data Source=:memory:");

static TestClass()
{
    // 手动打开连接,只要连接不关闭,内存库就不会销毁
    _testDbConnection.Open();
}

// 测试全部执行完成后关闭连接释放资源
public static void DisposeTestDb()
{
    _testDbConnection.Close();
    _testDbConnection.Dispose();
}

然后修改你的SqlBusinessDb实例化逻辑,把这个已打开的连接传进去,OnConfiguring里UseSqlite的时候直接传连接对象,不要传连接字符串:

// 实例化DbContext时传入已打开的连接
var realRepository = new SqlBusinessDb(_testDbConnection);

// OnConfiguring里对应修改UseSqlite的参数
optionsBuilder.UseSqlite(传入的连接对象, opt => {
    // 原有配置保留
    opt.CommandTimeout(SqlSettings.s_CommandTimeoutInSec.CurrentValue)
       .MigrationsHistoryTable("_BusinessDB_Migrations");
})
  • 第二步:优先用EnsureCreated()代替Migrate()做单元测试初始化
    如果你的迁移是针对SQL Server编写的,大概率包含SQL Server专属语法,在SQLite下执行会报错。单元测试场景如果不需要测试迁移逻辑本身,直接调用realRepository.Database.EnsureCreated()即可,它会直接根据你的Entity配置创建表结构,不需要依赖迁移历史表。
    如果你确实需要测试迁移逻辑,要单独生成SQLite专属的迁移文件,不要和SQL Server的迁移混用。

  • 第三步:修正冗余错误配置
    你app.config里写的providerName="System.Data.SQLite.EF6"是EF6时代的SQLite驱动标识,你用的是EF Core的Microsoft.EntityFrameworkCore.Sqlite驱动,这个配置已经不生效了,直接删掉即可,避免后续配置混淆。


内容的提问来源于stack exchange,提问作者Kevin McDowell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 06:45:04