C#怎么使用EF Core进行数据迁移_C# Migration数据库迁移教程【实战】

裘德小鎮的故事

裘德小鎮的故事

2026-05-13

882人浏览

原创

ef core迁移需模型快照、di链与数据库提供程序协同,常见错误如dbcontext构造失败、update-database连错库、sql生成异常及多人迁移冲突,须按规范配置无参构造、显式指定上下文与连接字符串、人工审查迁移脚本并严格同步历史表与文件。

c#怎么使用ef core进行数据迁移_c# migration数据库迁移教程【实战】

EF Core 迁移不是“改完模型就 update”就能生效的流程,跳过 dotnet ef migrations add 直接跑 dotnet ef database update,数据库结构完全不会变,而且不报错——它只是静默跳过。

为什么 dotnet ef migrations add 总报 “Unable to create an object of type 'AppDbContext'”

这个错误不是 DbContext 写得不对,而是 EF CLI 工具根本没机会走到你的 DI 容器里去解析依赖。它尝试用反射直接 new 实例,所以:

  • 如果 AppDbContext 构造函数只接受 DbContextOptions<appdbcontext></appdbcontext>,而你没注册任何服务(CLI 不读 Program.cs),就会崩
  • 项目里有多个 DbContext 子类,但没加 --context AppDbContext,CLI 就随机选一个或报错
  • 没写无参构造函数,且 OnConfiguring 也没重写,CLI 就连连接字符串都不知道从哪来

最稳妥的解法是加一个仅用于迁移的无参构造:

public AppDbContext() : base(new DbContextOptionsBuilder<appdbcontext>()
    .UseSqlServer("Server=.;Database=TestDb;Trusted_Connection=true;")
    .Options)
{ }</appdbcontext>

或者更推荐:显式指定上下文和项目路径,绕过构造函数陷阱:

dotnet ef migrations add InitialCreate --project MyDataProject --startup-project MyWebProject --context AppDbContext

dotnet ef database update 连错了库,或者压根没更新表结构

Update-Database 默认不看 appsettings.json,它优先读 Program.csAddDbContext 时硬编码的连接字符串。常见踩坑点:

C函数速查手册(CHM版)
C函数速查手册(CHM版)

C函数速查手册(CHM版)

下载
  • 你在 appsettings.json 改了 ConnectionStrings:DefaultConnection,但 Program.cs 里还是写死的旧地址
  • 用了 AddDbContextPool,却忘了在 UseSqlServer 里传 builder.Configuration.GetConnectionString("DefaultConnection")
  • 想切测试库,但没加 -c 参数,结果更新到了本地开发库

安全做法是显式传连接字符串:

dotnet ef database update -c "Server=localhost\SQLEXPRESS;Database=MyAppTest;Trusted_Connection=true;"

或者确保 Program.cs 的注册逻辑真正读取配置项,而不是字符串字面量。

生成的迁移文件里 Up() 是空的,或者 SQL 缺索引、字段没加 nullable=false

EF Core 不对比数据库,它只对比当前代码模型和上一次生成的 ModelSnapshot.cs。所以:

  • 手动删过迁移文件但没删 ModelSnapshot.cs,EF 就认为“模型没变”,生成空 Up()
  • 你加了 [Required] 或用了 Fluent API 配置索引,但上次 migrations add 没成功执行,快照没更新,新变更就不会进 SQL
  • 改过历史迁移里的 Up() 方法(比如删了某行 Annotation),后续所有迁移都基于这个被篡改的快照推导,越错越远

检查迁移链是否干净:

  • 确认 Migrations/ 下有 *_InitialCreate.cs 和对应 .Designer.cs;没有就先补一个
  • 删迁移文件时,必须把同名的 .cs.Designer.cs 一起删,否则快照仍指向旧状态
  • 实体类改完后,必须先 add 新迁移,再 update,不能跳步

迁移本质是模型版本管理,不是自动同步工具。快照文件、构造函数兼容性、连接字符串来源这三处最容易被忽略,但任意一处断掉,整个流程就静默失效——它不会报错,只会什么也不做。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c#

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1111

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

2262

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

2132

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

2322

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

336

5

c#是什么意思
c#是什么意思

C#是一种通用的面向对象编程语言,它在.NET框架上运行,可用于开发各种类型的应用程序。本专题为大家提供c#相关的各种文章、以及下载和课程。

2023.08.08

528

5

什么是c#
什么是c#

C#(读作C Sharp)是一种现代的、通用的、面向对象的编程语言。它由微软公司开发,于2000年首次发布,主要用于开发Windows桌面应用程序、Web应用程序、移动应用程序以及游戏开发等领域。C#是一种类型安全和托管的编程语言,它结合了C++的强大性能和C语言的简单易学特点,并引入了许多新的特性和概念,如委托、属性、泛型和异步编程等,以提高开发效率和代码可维护性。

2023.08.31

1180

3

C#中base关键字的用法
C#中base关键字的用法

在C#中,base关键字用于访问当前类的基类成员,这包括基类的字段、属性、方法、构造函数、索引器以及事件。想了解更多C#的相关内容,可以阅读本专题下面的文章。

2024.03.13

556

8

C#Task用法
C#Task用法

Task在C#中是用于表示异步操作的对象,它位于System.Threading.Tasks命名空间中。想了解更多C#中各种用法的相关内容,可以阅读本专题下面的文章。

2024.03.14

1051

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
RabbitMQ 教程手册
RabbitMQ 教程手册

共0课时 | 0人学习

Linux man-pages 项目
Linux man-pages 项目

共0课时 | 0人学习

C# 教程
C# 教程

共94课时 | 20.2万人学习