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

C# Entity Framework同库使用多个泛型DbContext提示No such Table报错

问题根因分析
  • 核心问题是Database.EnsureCreated()的运行机制:该方法仅会在数据库完全不存在时,才会根据当前上下文的实体映射创建库和对应表;只要数据库已经存在,无论当前上下文中有没有新增的实体需要建表,EnsureCreated都会直接跳过执行,不会做任何表结构的增量更新。
    你第一次用DbEntryController<Event>实例时,触发EnsureCreated创建了数据库和Event对应的表,后续使用DbEntryController<MyModel>时,检测到数据库已存在,不会自动创建MyModel对应的表,自然抛出表不存在的异常。
    同时你的泛型DbEntryController<TEntity>设计每个实例仅包含当前TEntity对应的单个DbSet,所以每次执行EnsureCreated只会识别当前泛型参数对应的实体,本身就不会处理其他实体的建表需求。
  • 次要问题是SQLite不支持Schema:你在OnModelCreating中给ToTable方法传递了schema参数,而SQLite没有Schema的概念,这会导致实际生成的表名和你预期的不符,即使表创建成功也可能出现找不到表的问题。
  • 额外冗余问题:你在FromDBPath初始化上下文和SaveChanges方法中重复调用了EnsureCreated和Migrate,不仅没有作用还会影响性能,且Migrate方法依赖预先生成的迁移文件,你没有配置迁移的情况下调用该方法完全无效。
解决方案
  • 方案一(推荐):放弃单实体泛型上下文的设计,统一编写一个DbContext,将所有需要用到的实体都声明为对应的DbSet属性,这样第一次调用EnsureCreated时就会一次性创建所有表,不会出现漏建表的问题。
  • 方案二(保留泛型上下文):不再依赖EnsureCreated建表,每次初始化泛型上下文时,先手动查询SQLite的sqlite_master系统表判断对应表是否存在,如果不存在则手动执行建表SQL,或者调用EF Core的Database.ExecuteSqlRaw方法生成对应实体的建表语句执行。
  • 同步修复点:删除OnModelCreating中ToTable方法的schema参数,同时移除SaveChanges中重复的EnsureCreated和Migrate调用,避免无效逻辑。

内容的提问来源于stack exchange,提问作者Felix Arnold

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 17:24:02