执行EF Core迁移后SQLite中Members表不存在的问题排查
EF Core + SQLite 查询提示“no such table: Members”问题排查与解决
问题场景
在使用Entity Framework Core和SQLite的.NET控制台应用中,已在appsettings.json配置连接字符串,定义了Member类及包含DbSet<Member>的上下文类。执行EF Core迁移命令(migrations add和database update)提示架构创建成功,但查询Members表时抛出异常:
Microsoft.Data.Sqlite.SqliteException: no such table: Members
用户提供的代码文件
Program.cs
using System.Text; using System.Xml.Serialization; using Microsoft.Data.Sqlite; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Uebung; using Uebung.Data.Models; await using var db = new MemberContext(); Console.WriteLine($"Database path: {db.MemberDb}"); Console.WriteLine("Querying all members:"); var results = from member in db.Members select member; await foreach (var s in results.AsAsyncEnumerable()) { Console.WriteLine("Member: " + s.Vorname + " " + s.Nachname); }
appsettings.json
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*", "ConnectionStrings": { "DefaultConnectionString": "DataSource=members.db;" } }
Member.cs
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; namespace Uebung.Data.Models; public class MemberContext : DbContext { public DbSet<Member> Members { get; set; } public string MemberDb { get; set; } public MemberContext() { MemberDb = "members.db"; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlite($"Data Source={MemberDb}"); } } public class Member { [Key] public int ID { get; set; } public string? Vorname { get; set; } public string? Nachname { get; set; } }
AppDbContext.cs
using Microsoft.EntityFrameworkCore; using Uebung; public class AppDbContext : DbContext { public DbSet<Uebung.Data.Models.Member> Members { get; set; } public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { } }
问题原因分析
- 重复的DbContext类:项目中同时存在
MemberContext和AppDbContext两个上下文类,迁移操作可能针对其中一个执行,但查询时使用了另一个,导致两者对应的数据库不一致。 - 配置读取不统一:
MemberContext硬编码数据库路径为members.db,未读取appsettings.json的配置;而迁移若基于AppDbContext执行,会使用配置文件中的连接字符串,两者可能指向不同位置的数据库文件(比如迁移在项目根目录生成数据库,查询时在输出目录创建新的空数据库)。 - 迁移上下文未指定:执行迁移命令时未明确指定使用的DbContext,可能导致迁移应用到错误的上下文,查询用的上下文对应的数据库并无表结构。
解决步骤
1. 统一DbContext,移除冗余类
保留AppDbContext(支持依赖注入读取配置),删除MemberContext,修改Program.cs使用依赖注入获取上下文:
using System.Text; using System.Xml.Serialization; using Microsoft.Data.Sqlite; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Uebung; using Uebung.Data.Models; // 构建主机,读取配置并注册DbContext var host = Host.CreateDefaultBuilder() .ConfigureServices((context, services) => { services.AddDbContext<AppDbContext>(options => options.UseSqlite(context.Configuration.GetConnectionString("DefaultConnectionString"))); }) .Build(); // 从服务容器获取DbContext await using var scope = host.Services.CreateAsyncScope(); var db = scope.ServiceProvider.GetRequiredService<AppDbContext>(); Console.WriteLine("Querying all members:"); var results = from member in db.Members select member; await foreach (var s in results.AsAsyncEnumerable()) { Console.WriteLine("Member: " + s.Vorname + " " + s.Nachname); }
2. 重新执行迁移并指定上下文
确保迁移应用到AppDbContext:
# 添加初始迁移 dotnet ef migrations add InitialCreate --context AppDbContext # 更新数据库 dotnet ef database update --context AppDbContext
3. 统一数据库文件位置
SQLite相对路径会随运行环境变化,可在连接字符串中指定绝对路径,或使用相对路径指向项目根目录:
"DefaultConnectionString": "DataSource=../members.db;"
4. 验证数据库结构
用SQLite工具(如DB Browser for SQLite)打开目标数据库文件,确认Members表已创建。若不存在,重新执行迁移命令。
内容的提问来源于stack exchange,提问作者Görkem
相关产品推荐
相关产品推荐

