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

.NET Core 7 WPF应用中SQLite与EF Core的表更新方案问询

解决.NET Core 7 WPF+SQLite模型变更后的数据库更新问题

EnsureCreated()仅会在数据库不存在时创建结构,完全不处理模型变更,这就是你新增表后报错的原因。要实现不丢失数据的模型同步,直接用EF Core的迁移功能即可,步骤如下:

1. 启用并生成迁移

  • 打开包管理器控制台(或.NET CLI),首次执行:
    Add-Migration InitialCreate
    
    之后每次修改数据模型(新增表、字段等),都执行:
    Add-Migration [迁移名称]
    
    比如新增了User表,就执行Add-Migration AddUserTable。执行后项目会生成迁移文件,记录模型的变更细节。

2. 在应用启动时自动应用迁移

把原来的context.Database.EnsureCreated()替换为迁移应用逻辑,确保启动时自动同步数据库结构:

// Database
var optionsBuilder = new DbContextOptionsBuilder<SpproContext>()
                         .UseSqlite(DB_CONNECTION);
using (var context = new SpproContext(optionsBuilder.Options))
{
    // 自动应用所有未执行过的迁移,不会丢失现有数据
    context.Database.Migrate();
}

serviceCollection.AddDbContextPool<SpproContext>(options =>
        options.UseSqlite(DB_CONNECTION));

Migrate()会自动检查数据库的迁移历史表,只执行未应用的迁移脚本,完全保留现有数据。

3. 兼容已用EnsureCreated创建的数据库

如果之前已经用EnsureCreated()生成了数据库,首次执行迁移会因为缺少迁移历史表报错。解决方法:

  1. 生成初始迁移:Add-Migration Initial
  2. 生成SQL脚本:Script-Migration -From 0 -To Initial
  3. 用SQLite工具(比如DB Browser for SQLite)打开现有数据库,执行生成的脚本,创建迁移历史表。之后就能正常使用Migrate()了。

4. SQLite迁移注意事项

SQLite本身对DDL操作有一定限制,比如不支持直接删除列、修改列类型。遇到这类场景:

  • 手动编辑迁移文件的Up()方法,用创建新表→迁移数据→删除旧表→重命名新表的方式实现变更
  • 或者参考EF Core文档中针对SQLite的迁移适配方案

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 14:37:01