C# EF Core迁移数据库

现象:

在CodeFirst时,先写字段与表,创建数据库后,再添加内容

但字段与表会变更,比如改名·删除·增加等

需求:

当表字段变更时,同时变更数据库,执行数据库迁移


核心命令

Add-Migration firstMigration

update-database

步骤

打开程序包管理窗口

工具=>NuGet包管理器=>程序包管理控制台

Add-Migration代表迁移命令:后边参数为名称

输入命令:

cs 复制代码
Add-Migration firstMigration

但是可能会报错,提示EntityFramework的程序包未安装

Your target project 'ShangShangQian' doesn't reference EntityFramework. This package is required for the Entity Framework Core Tools to work. Ensure your target project is correct, install the package, and try again.

NuGet安装下

安装完毕,再执行Add-Migration firstMigration

No migrations configuration type was found in the assembly 'ShangShangQian'. (In Visual Studio you can use the Enable-Migrations command from Package Manager Console to add a migrations configuration).

在程序集"ShangShangQian"中找不到迁移配置类型。(在Visual Studio中,可以使用Package Manager控制台中的"启用迁移"命令添加迁移配置)。

再去执行:启用迁移"命令

cs 复制代码
Enable-Migrations

哦......可能得加个数据库上下文,就是你继承DbContext的类

再执行下Enable-Migrations -ContextTypeName 加上命名空间与类名

cs 复制代码
Enable-Migrations -ContextTypeName ShangShangQian.EFCore.DataBaseContext

Checking if the context targets an existing database...

System.ArgumentException: The type 'DataBaseContext' does not inherit from DbContext. The DbMigrationsConfiguration.ContextType property must be set to a type that inherits from DbContext

The type 'DataBaseContext' does not inherit from DbContext. The DbMigrationsConfiguration.ContextType property must be set to a type that inherits from DbContext.

正在检查上下文是否以现有数据库为目标。。。

系统ArgumentException:类型"DataBaseContext"不是从DbContext继承的。DbMigrationsConfiguration。ContextType属性必须设置为从DbContext继承的类型。

继承了啊,奇了怪了............

Goole下=>缺个 Microsoft.EntityFrameworkCore.Tools 装下

再执行添加启用迁移命令:

Enable-Migrations -ContextTypeName ShangShangQian.EFCore.DataBaseContext

Both Entity Framework Core and Entity Framework 6 are installed. The Entity Framework Core tools are running. Use 'EntityFramework6\Enable-Migrations' for Entity Framework 6.

Enable-Migrations is obsolete. Use Add-Migration to start using Migrations.

实体框架核心和实体框架6都已安装。实体框架核心工具正在运行。对实体框架6使用"EntityFramework6\启用迁移"。

"启用迁移"已过时。使用"添加迁移"开始使用迁移。

=======》去你姥姥的,坑我,这不回到了起点《=======

Add-Migration firstMigration

死马当活马医吧,执行试试

再跑下更新命令?

cs 复制代码
update-database

表模型变更,执行这俩行,去测试下 把表和字段增加·删除·试试,哦 报错了......

Failed executing DbCommand (0ms) [Parameters=[], CommandType='Text', CommandTimeout='30']

CREATE TABLE "Chats" (

"ChatID" INTEGER NOT NULL CONSTRAINT "PK_Chats" PRIMARY KEY AUTOINCREMENT,

"FromID" INTEGER NOT NULL,

"ToID" INTEGER NOT NULL,

"Message" TEXT NOT NULL,

"Type" INTEGER NOT NULL,

"IsRead" INTEGER NOT NULL,

"SendTime" TEXT NOT NULL,

"ReadTime" TEXT NOT NULL,

"IsPushFrom" INTEGER NOT NULL,

"IsPushTo" INTEGER NOT NULL

);

SQLite Error 1: 'table "Chats" already exists'.

为啥执行更新数据库要创建表呢,db已经存在了啊

又坑了我半天......就这样半个世纪过去了

不要灰心,猛补各种教学,原来是流程问题

问题出在EnsureCreatedAsync这个函数上

首次执行Add-Migration firstMigration命令,生成的迁移文件全是创建指令

再执行update-database

会执行创建表的命令,

但是之前通过EnsureCreatedAsync函数创建db数据库,已有表

所以报错,把db 与函数删除就可以了

创建数据库应由数据库迁移命令完成 update database

再此执行就可以

更高级的数据库功能请自行研究吧,如回退等

你也去补习下吧


文章写的有点乱

原本更新数据库分分钟的事,鼓捣半天,主要还是不熟

不过管他呢,代码能跑就行

相关推荐
S1998_1997111609•X8 小时前
论当今社会主义与人文关怀人格思想下的恶意仿生注入污染蜜罐描述进行函数值非法侵入爬虫的咼忄乂癿〇仺⺋.
数据库·网络协议·百度·ssh·开闭原则
倔强的石头_9 小时前
kingbase备份与恢复实战(六)—— 备份自动化与保留策略:Windows任务计划+日志追溯
数据库
轻刀快马10 小时前
别被 ORM 框架宠坏了:从一场“订单消失”悬案,看懂 MySQL 为什么要强推 InnoDB
数据库·mysql
后端漫漫12 小时前
Redis 客户端工具体系
数据库·redis·缓存
PaperData13 小时前
1988-2025年《中国人口和就业统计年鉴》全年份excel+PDF
数据库·人工智能·数据分析·经管
星河耀银海13 小时前
C语言与数据库交互:SQLite实战与数据持久化
c语言·数据库·sqlite·交互
过期动态14 小时前
MySQL中的约束
android·java·数据库·spring boot·mysql
程序员陆通14 小时前
月烧 400 刀到不到 20 刀:我是怎么把 OpenClaw 的 Token 账单砍掉 95% 的
java·前端·数据库
Shan120514 小时前
站在计算机领域视角看:SQL注入攻击
网络·数据库·sql
轻刀快马14 小时前
别干背八股文了:从一场“双十一秒杀”惨案,看懂 InnoDB 事务、锁与索引的底层齿轮
数据库·sql