1. 程式人生 > 其它 >如何將EFCore遷移分離到單獨類庫專案?

如何將EFCore遷移分離到單獨類庫專案?

上篇文章: EFCore生產環境資料庫升級方案 中我們聊瞭如何將EFCore遷移(實體模型變更)應用到生產環境的方案,在上次的演示中,我們是將所有遷移存放到了定義DbContext的類庫專案中去,在這邊文章中我來介紹下如何將遷移單獨存放到一個類庫專案中去,以便管理EF生成的遷移檔案。

這篇文章中,我們繼續使用 EFCore生產環境資料庫升級方案 中的例子專案進行改造,來實現將所有EF遷移檔案單獨提取到類庫專案中去,本文和 EFCore生產環境資料庫升級方案 是同一個系列的文章,如果你還沒有閱讀前一篇文章,強烈建議先閱讀前文。

一、新建類庫專案,將EF遷移檔案及遷移快照檔案移動到新的類庫專案中

新建名稱為 EFMigrations.DataMigrations 的類庫專案

這裡需要注意的是:如果還沒有生成任何遷移檔案,則請先至少生成一個,再將新生成的遷移檔案複製到新建的類庫專案EFMigrations.DataMigrations 中去。

二、類庫專案新增對包含DbContext上下文類的引用。

新增EFMigrations.Models類庫專案的引用到EFMigrations.DataMigrations,如下:

三、將預設的遷移程式集指定為新建的類庫專案。

將EFMigrations.Models 中的所有的EF遷移檔案及遷移生成的SQL指令碼檔案移動到EFMigrations.DataMigrations專案中去。

移動完畢後,EFMigrations.Models中僅包含EF DbContext 上下文類,以及實體模型,如下圖所示:

四、告訴啟動專案遷移程式集是哪個

啟動專案指的是告訴 EF命令列遷移工具從哪個專案開始啟動,然後執行遷移檔案的生成,這裡我們的啟動專案是EFMigrations.Web 專案,修改Startup.cs檔案中的ConfigureService方法如下:

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<MyDbContext>(builder=> {
                builder.UseSqlServer(Configuration["ConnectionStrings:ConnectionStr"
],optionsBuilder=> { //這裡告訴EFcore 命令列遷移工具,等下生成的遷移檔案放到EFMigrations.DataMigrations 專案中去。 optionsBuilder.MigrationsAssembly("EFMigrations.DataMigrations"); }); }); services.AddControllersWithViews(); }

新增EFMigrations.DataMigrations的引用到EFMigrations.Web,然後重新生成下EFMigrations.Web專案,否則等下生成遷移會失敗,因為不新增引用等下EFMigrations.Web專案啟動後開始生成遷移的時候會找不到EFMigrations.DataMigrations.dll

五、測試新新增的遷移是否正常生成到了新建的類庫專案中去。

我們新建一個實體模型OrderInfo,並將其新增到DbContext 上下文中去。

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text;

namespace EFMigrations.Models
{
    public class OrderInfo
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int OrderId { get; set; }
        public int ProductId { get; set; }
        public double Price { get; set; }
        public int BuyCount { get; set; }
        public int UserId { get; set; }
    }
}

修改DbContext上下文類,增加OrderInfo實體對映。

using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Text;

namespace EFMigrations.Models
{
    public class MyDbContext : DbContext
    {
        /// <summary>
        /// 這裡一定要宣告一個接收DbContextOptions引數的建構函式,否則無法正常新增遷移。
        /// </summary>
        /// <param name="options"></param>
        public MyDbContext(DbContextOptions<MyDbContext> options) : base(options)
        {
        }
        public DbSet<UserInfo> UserInfos { get; set; }
        public DbSet<OrderInfo> OrderInfos { get; set; }
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            base.OnConfiguring(optionsBuilder);
        }
    }
}

開啟程式包管理控制檯,輸入以下命令:

cd ./EFMigrations.DataMigrations 將當前目錄定位到遷移程式所在專案的根目錄下,免得下面這個步驟生成遷移檔案的時候還要額外用-p 引數指定遷移程式集的專案路徑。

dotnet ef migrations add OrderInfo_CreateTable -s ../EFMigrations.Web

遷移生成成功後如下:

將新生成的遷移轉換成SQL,在程式包管理控制檯中輸入以下命令:

dotnet ef migrations script 20210830142733_UserInfo_AddColumns 20210902141104_OrderInfo_CreateTable -s ../EFMigrations.Web -o ./SqlScripts/OrderInfo_CreateTable.sql

以上命令的意思是將 20210830142733_UserInfo_AddColumns遷移(不包含)的下一個遷移開始,截止到 20210902141104_OrderInfo_CreateTable(包含) 之間的所有遷移轉換成SQL指令碼進行生成,生成成功後,SQL指令碼如下:

六、將SQL指令碼升級到資料庫

  • 首先需要將生成的SQL指令碼設定成在生成專案的時候嵌入到程式集:滑鼠右擊 OrderInfo_CreateTable.sql ,選擇屬性->生成操作->嵌入的資源
  • 然後將EFMigrations.Models 類中的 ApplicationBuilderExtensions 類移動到EFMigrations.DataMigrations專案中去,之所以這麼做是方便dbup-sql 類庫找.sql指令碼時直接從當前程式集中查詢

  • 重啟網站,看下是否新SQL指令碼是否成功被升級到了資料庫

這裡需要注意的是,由於在上一篇文章中我已經將前面兩個SQL 指令碼升級到了資料庫中,並且很有意思的事情是dbup-sqlserver記錄已升級指令碼的名稱時帶上了程式集明明空間,因此這裡直接執行會升級失敗,我們必須手動先將資料庫中的已升級指令碼記錄的字首名稱更新為EFMigartions.DataMigrations開頭方能再次升級成功。

我們將EFMigrations.Models替換成EFMigrations.DataMigrations後再重新升級,如下圖顯示,表示升級成功了

出處:https://www.cnblogs.com/chenxinblogs/p/15221151.html

您的資助是我最大的動力!
金額隨意,歡迎來賞!
款後有任何問題請給我留言。

如果,您認為閱讀這篇部落格讓您有些收穫,不妨點選一下右下角的推薦按鈕。
如果,您希望更容易地發現我的新部落格,不妨點選一下綠色通道的關注我。(●'◡'●)

如果你覺得本篇文章對你有所幫助,請給予我更多的鼓勵,求打 付款後有任何問題請給我留言!!!

因為,我的寫作熱情也離不開您的肯定支援,感謝您的閱讀,我是【Jack_孟】!