日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

Entity Framework Core 之数据库迁移

發(fā)布時(shí)間:2023/12/4 数据库 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Entity Framework Core 之数据库迁移 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

最近打算用.NET Core寫(xiě)一份開(kāi)源的簡(jiǎn)易CMS系統(tǒng),來(lái)練練手

所以又去深入研究了一下Entity Framework Core?

發(fā)現(xiàn)其實(shí)有些細(xì)節(jié)園子里還是很少講到.

特意整理了幾個(gè)細(xì)節(jié).

?

正文

1.數(shù)據(jù)庫(kù)遷移

先了解一下什么是"數(shù)據(jù)庫(kù)遷移",它提供了一種方法,可以逐步將Code First的實(shí)體架構(gòu)更改應(yīng)用于數(shù)據(jù)庫(kù),以保持?jǐn)?shù)據(jù)庫(kù)與EF Core模型同步,同時(shí)保留數(shù)據(jù)庫(kù)中的現(xiàn)有數(shù)據(jù)。

EF Core的數(shù)據(jù)遷移相對(duì)EF6來(lái)說(shuō)改了不少也簡(jiǎn)化了一些.所以我們現(xiàn)在就來(lái)看看如何進(jìn)行數(shù)據(jù)遷移

我們以官方代碼來(lái)做為例子..先來(lái)創(chuàng)建一個(gè)簡(jiǎn)單的上下文.

? ? public class BloggingContext : DbContext

? ? {

? ? ? ? public BloggingContext()

? ? ? ? ? ? : base()


? ? ? ? {

? ? ? ? }

? ? ? ? private static ILoggerFactory Mlogger => new LoggerFactory();

? ? ? ? ? ? ? ?

? ? ? ? protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)

? ? ? ? {

? ? ? ? ? ? Mlogger.AddProvider(new MyFilteredLoggerProvider());

? ? ? ? ? ? var loggerFactory =?

? ? ? ? ? ? ? ? ?optionsBuilder

? ? ? ? ? ? ? ? .UseMySql(@"鏈接地址");

? ? ? ? ? ?

? ? ? ? }

? ? ? ? protected override void OnModelCreating(ModelBuilder modelBuilder)

? ? ? ? {

? ? ? ? }


? ? ? ? public DbSet<Blog> Blogs { get; set; }

? ? ? ? public DbSet<Post> Posts { get; set; }

? ? }


? ? public class Blog

? ? {

? ? ? ? public int BlogId { get; set; }

? ? ? ? public string Url { get; set; }


? ? ? ? public List<Post> Posts { get; set; }

? ? }


? ? public class Post

? ? {

? ? ? ? public int PostId { get; set; }

? ? ? ? [MaxLength(50)]

? ? ? ? public string Title { get; set; }

? ? ? ? public string Content { get; set; }


? ? ? ? public int? BlogId { get; set; }

? ? ? ? public Blog Blog { get; set; }

? ? }

}

然后我們通過(guò)Nuget來(lái)添加引用.

Microsoft.EntityFrameworkCore.Tools

打開(kāi)NuGet包管理控制臺(tái)

選擇默認(rèn)項(xiàng)目為實(shí)體上下文所在的程序集如下:

首先我們需要添加一個(gè)遷移版本.

執(zhí)行命令如下:

Add-Migration BanBen1(這里是版本的名稱(chēng),可以自己定義)

我們會(huì)發(fā)現(xiàn)Model程序集下多了一個(gè)文件夾為Migrations里面有3個(gè)文件.如下:

  • XXXXXXXXXXXXX_BanBen1.cs?- 主遷移文件。包含應(yīng)用遷移(in?Up())和恢復(fù)(in?Down()所需的操作。

  • XXXXXXXXXXXXX_BanBen1.Designer.cs?- 遷移元數(shù)據(jù)文件。包含EF使用的信息。

  • BloggingContextModelSnapshot.cs?- 當(dāng)前模型的快照。主要用于確定添加下一次遷移時(shí)發(fā)生了哪些變化.

然后我們執(zhí)行命令

Update-Database

如果你的數(shù)據(jù)庫(kù)沒(méi)創(chuàng)建,是第一次,就會(huì)執(zhí)行成功,

如果你前期創(chuàng)建過(guò)數(shù)據(jù)庫(kù).但是是第一次創(chuàng)建遷移..就會(huì)失敗.(注意這里!!)

因?yàn)榈谝淮紊傻倪w移方法是按照新增來(lái)遷移的..而不是修改.

錯(cuò)誤信息可能會(huì)如圖:

解決方法是找到XXXXXXXXXXXXX_BanBen1.cs?- 主遷移文件,刪除Up和Down里面的代碼.

刪除后如下:

? ? public partial class BanBen1 : Migration

? ? {

? ? ? ? protected override void Up(MigrationBuilder migrationBuilder)

? ? ? ? {


? ? ? ? }


? ? ? ? protected override void Down(MigrationBuilder migrationBuilder)

? ? ? ? {

? ? ? ? ??

? ? ? ? }

? ? }

其實(shí)這次遷移就沒(méi)有修改數(shù)據(jù)庫(kù)任何信息..

我們?cè)趤?lái)創(chuàng)建第二個(gè)遷移版本..

首先,我們修改實(shí)體類(lèi)..給Post的Content加上長(zhǎng)度限制,如下:

public class Post

? ? {

? ? ? ? public int PostId { get; set; }

? ? ? ? [MaxLength(50)]

? ? ? ? public string Title { get; set; }

? ? ? ? [MaxLength(50)]

? ? ? ? public string Content { get; set; }


? ? ? ? public int? BlogId { get; set; }

? ? ? ? public Blog Blog { get; set; }

? ? }

然后我們開(kāi)始遷移..

記得每次遷移,都需要?jiǎng)?chuàng)建一個(gè)遷移版本!

我們執(zhí)行命令如下(注意,我們的版本已經(jīng)改為了2):

Add-Migration BanBen2

成功創(chuàng)建遷移文件之后,我們更新數(shù)據(jù)庫(kù).

Update-Database

成功信息如下:

然后我們進(jìn)入數(shù)據(jù)庫(kù)看看效果:

我們發(fā)現(xiàn)Content的長(zhǎng)度限制已經(jīng)改為了50

?

2.刪除遷移

?有的時(shí)候我們剛剛創(chuàng)建了一個(gè)遷移,還沒(méi)應(yīng)用到數(shù)據(jù)庫(kù),就發(fā)現(xiàn)自己需要變更實(shí)體.那我們就可以刪除這個(gè)沒(méi)有應(yīng)用的遷移版本.

執(zhí)行命令如下:(注意,這里是沒(méi)有應(yīng)用過(guò)的遷移,可以刪除.如果應(yīng)用過(guò)了.則會(huì)收到錯(cuò)誤信息)

Remove-Migration

3.遷移回滾.

有些時(shí)候,我們需要回滾到之前的一個(gè)遷移版本.,比如我們部署的時(shí)候,開(kāi)發(fā)版本和穩(wěn)定版本肯定不一樣..

那么我們就會(huì)用到回滾命令.

執(zhí)行如下:

Update-Database 這里填寫(xiě)需要回滾的版本名

,比如我們執(zhí)行如下:

Update-Database BanBen1

然后我們會(huì)發(fā)現(xiàn),BanBen2中的長(zhǎng)度限制,已經(jīng)沒(méi)有了..

?

4.生成一個(gè)遷移SQL腳本

有的時(shí)候,我們的生產(chǎn)數(shù)據(jù)庫(kù),是需要用腳本來(lái)創(chuàng)建庫(kù)的.所以我們也可以直接通過(guò)實(shí)體來(lái)生成SQL腳本.命令如下:

Script-Migration

就會(huì)生成對(duì)應(yīng)的遷移SQL腳本.如下:

CREATE TABLE `__EFMigrationsHistory` (

? ? `MigrationId` varchar(95) NOT NULL,

? ? `ProductVersion` varchar(32) NOT NULL,

? ? CONSTRAINT `PK___EFMigrationsHistory` PRIMARY KEY (`MigrationId`)

);


INSERT INTO `__EFMigrationsHistory` (`MigrationId`, `ProductVersion`)

VALUES ('20180316015722_BanBen1', '2.0.2-rtm-10011');


ALTER TABLE `Posts` MODIFY COLUMN `Content` varchar(50) NULL;

ALTER TABLE `Posts` ALTER COLUMN `Content` DROP DEFAULT;

INSERT INTO `__EFMigrationsHistory` (`MigrationId`, `ProductVersion`)

VALUES ('20180316022508_BanBen2', '2.0.2-rtm-10011');

當(dāng)然,這個(gè)腳本可以自定義需要遷移的版本號(hào).文件名,需要生成遷移腳本的上下文(多個(gè)上下文的情況).

?

5.遷移腳本的幫助說(shuō)明.

我們可以通過(guò)命令來(lái)獲取幫助說(shuō)明

Get-Help about_EntityFrameworkCore
get-help Add-Migration -full
get-help Script-Migration -full

原文:https://www.cnblogs.com/GuZhenYin/p/8579420.html


.NET社區(qū)新聞,深度好文,歡迎訪問(wèn)公眾號(hào)文章匯總 http://www.csharpkit.com

總結(jié)

以上是生活随笔為你收集整理的Entity Framework Core 之数据库迁移的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。