.NET6 EF Core修改模型后同步更新SQLite数据库表结构方案
问题说明
你定义的EF Core数据库上下文DatabaseContext代码如下:
public class DatabaseContext : DbContext { public DbSet<Author> Authors { get; set; } public DbSet<Book> Books { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlite(@"Data Source=E:\Portfolio\FullStack\HomeLibraryManager\Database\Library.db;"); } }
初始化上下文的原有代码:
using (var context = new DatabaseContext()) { context.Database.EnsureCreated(); var books = context.Books.ToList(); }
核心认知偏差:EnsureCreated() 没有模型变更后同步表结构的能力。该方法仅会在目标数据库不存在时执行建库、建表操作,数据库一旦创建完成,后续模型发生任何修改(比如给实体加属性),调用这个方法都不会对已有表结构做任何调整,自然不会生成新列。
可行操作步骤
要实现给Book类加属性后同步新增对应表列,按以下流程操作即可:
- 先在
Book类中正常编写你需要新增的属性,完成模型层修改 - 打开终端切到你的项目根目录,执行EF Core迁移生成命令:
迁移名称建议语义化,比如新增的是出版年份属性就填dotnet-ef migrations add 自定义迁移名称AddPublishYearToBook,方便后续追溯变更。命令执行完成后,EF Core会自动对比当前模型和上一次迁移快照的差异,生成包含增列逻辑的迁移文件,存到项目的Migrations目录下。 - 修改上下文初始化逻辑,把
EnsureCreated()替换为Migrate()方法,修改后代码如下:
后续程序运行时,using (var context = new DatabaseContext()) { context.Database.Migrate(); var books = context.Books.ToList(); }Migrate()会自动检查所有未应用到数据库的迁移,按顺序执行对应SQL,自动完成表结构更新,你新增的属性会自动生成对应数据库列。
补充:如果是纯本地开发测试阶段、不需要保留历史数据,也可以用
context.Database.EnsureDeleted()+context.Database.EnsureCreated()的组合,每次模型变更直接删库重建表,但这个方案会清空所有已有数据,绝对不能在生产环境使用。
内容的提问来源于stack exchange,提问作者Caleb
相关产品推荐
相关产品推荐

