.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()生成了数据库,首次执行迁移会因为缺少迁移历史表报错。解决方法:
- 生成初始迁移:
Add-Migration Initial - 生成SQL脚本:
Script-Migration -From 0 -To Initial - 用SQLite工具(比如DB Browser for SQLite)打开现有数据库,执行生成的脚本,创建迁移历史表。之后就能正常使用
Migrate()了。
4. SQLite迁移注意事项
SQLite本身对DDL操作有一定限制,比如不支持直接删除列、修改列类型。遇到这类场景:
- 手动编辑迁移文件的
Up()方法,用创建新表→迁移数据→删除旧表→重命名新表的方式实现变更 - 或者参考EF Core文档中针对SQLite的迁移适配方案
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

