C# LINQ操作SQLite数据库:保存与迁移报错求助
问题分析与解决方案
错误原因解析
1. 表"Customers"已存在的原因
- 你大概率在之前的操作中已经创建过该表:要么是手动通过SQL工具建的,要么是EF Core用
EnsureCreated()方法自动生成的(这个方法不会和迁移系统交互),也可能是早期迁移执行后你删除了Migrations文件夹里的记录,但数据库里的表和__EFMigrationsHistory(EF存储迁移记录的系统表)还保留着,导致后续迁移执行时认为表未创建,重复执行建表语句引发冲突。
2. FirstName列找不到的原因
- 你的Model.cs里确实有
FirstName字段,但数据库中的Customers表是旧版本(没有这个列),迁移记录没有同步更新到数据库,所以调用SaveChanges()时ORM框架找不到对应列报错。你看到的Model是最新的,但实际数据库结构没跟上。
可行解决办法
办法一:删除数据库重建(开发阶段首选)
- 找到项目中的SQLite数据库文件(通常是
.db/.sqlite后缀),直接删除。 - 重新生成迁移并更新数据库:
dotnet ef migrations add InitialCreate dotnet ef database update - 重新运行程序,
SaveChanges()就能正常执行了。
办法二:手动更新现有表(需保留数据时用)
- 用SQLite可视化工具(比如DB Browser for SQLite)连接到你的数据库,执行SQL语句添加列:
注意:字段类型要和Model里的定义匹配,比如字符串用TEXT,整数用INTEGER,布尔值用INTEGER(1)等。ALTER TABLE Customers ADD COLUMN FirstName TEXT; - 之后同步迁移记录:
dotnet ef migrations add AddFirstNameColumn dotnet ef database update
办法三:修复迁移记录(适合熟悉EF迁移的场景)
- 删除Migrations文件夹下的所有文件,清空迁移历史。
- 删除数据库中的
__EFMigrationsHistory表(这是EF用来跟踪迁移的系统表)。 - 重新生成初始迁移并更新:
dotnet ef migrations add InitialCreate dotnet ef database update
后续避坑提醒
- 开发时全程用EF迁移管理数据库结构,别手动修改数据库表,避免Model、迁移记录、数据库三者结构不一致。
- 不要同时使用
EnsureCreated()和迁移系统,前者会绕开迁移直接建表,必然导致后续迁移冲突。
内容的提问来源于stack exchange,提问作者Frank
相关产品推荐
相关产品推荐

