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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 01:42:28