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

执行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)
    {

    }
}

问题原因分析

  1. 重复的DbContext类:项目中同时存在MemberContext和AppDbContext两个上下文类,迁移操作可能针对其中一个执行,但查询时使用了另一个,导致两者对应的数据库不一致。
  2. 配置读取不统一:MemberContext硬编码数据库路径为members.db,未读取appsettings.json的配置;而迁移若基于AppDbContext执行,会使用配置文件中的连接字符串,两者可能指向不同位置的数据库文件(比如迁移在项目根目录生成数据库,查询时在输出目录创建新的空数据库)。
  3. 迁移上下文未指定:执行迁移命令时未明确指定使用的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 00:55:55