net core 依賴注入,.NET 5中的EF Core 5數據遷移:在單獨的庫中并自動部署

 2023-10-01 阅读 20 评论 0

摘要:目錄 1.簡介 2.先決條件 3.使用Dotnet CLI創建解決方案和項目框架 4.在DataAcess中創建模型和數據上下文 5.在WebApp中啟動數據庫 6.添加數據遷移功能 7.更改數據庫模型 在.NET 5中使用Entity Framework Core 5數據遷移進行項目的逐步瀏覽。數據遷移位于單獨的庫中,并且

目錄

1.簡介

2.先決條件

3.使用Dotnet CLI創建解決方案和項目框架

4.在DataAcess中創建模型和數據上下文

5.在WebApp中啟動數據庫

6.添加數據遷移功能

7.更改數據庫模型


.NET 5中使用Entity Framework Core 5數據遷移進行項目的逐步瀏覽。數據遷移位于單獨的庫中,并且會自動進行部署。

  • Github下載源代碼

我一直在想寫這個話題有一段時間了。我過去曾做過EF數據遷移的項目,但情況有所變化,它的庫依存關系也發生了變化。現在,繼續到現在,我將在.NET 5項目中以及EF Core 55.0.3)中進行此操作。

1.簡介

該博客的主要思想是您將使用Entity Framework編寫一個Web應用程序,不僅如此,您還希望該項目附帶一個數據遷移計劃。編寫應用程序時,數據庫可能會隨著時間的推移而發展,并且您希望在實時生產環境中優雅地逐步遷移數據庫。這就是EF數據遷移發揮作用的地方。本文將分多個步驟逐步指導您。跳過所有其他編碼方面,例如配置、編碼標準、驗證等,甚至實體框架建模,以使核心問題(數據遷移)更加清晰。

2.先決條件

Microsoft允許從Visual Studio IDE模板或使用dotnet命令行(CLI)界面創建項目。在本文中,我們將通過dotnet CLI創建一個項目。此外,我們將使用Visual Studio Code而不是Visual Studio IDE,但是,用法僅限于編輯文件和瀏覽項目文件夾。所有構建和運行的應用程序都將通過dotnet CLI命令完成。這是一些先決條件:

  • 此處下載并安裝Visual Studio Code?
  • 運行Visual Studio代碼,然后從OmniSharp安裝C#擴展。要安裝擴展程序,請單擊左側面板上的圖標,或單擊菜單查看->擴展程序
  • 此處下載并安裝dotnet?5 SDSK?,您可以下載任何SDK版本v5.0.0或更高版本。如果您使用的是Windows操作系統,請確保已安裝的目錄包含在計算機系統PATH中。
  • 確保您具有啟用了Windows身份驗證MS SQL Server的本地實例。

3.使用Dotnet CLI創建解決方案和項目框架

我們將創建一個包含兩個項目的解決方案,主項目將通過一個空的Web模板生成,另一個項目是一個庫項目,其中包含我們的數據庫模型,上下文以及稍后的遷移文件。在這里,我們將通過命令提示符使用dotnet CLI命令執行此操作,或者您可以從Visual Studio Code打開終端

  • 為我們的解決方案EFCoreMigration創建目錄,然后移至該目錄:
mkdir EFCoreMigrationcd EFCoreMigration
  • 運行dotnet命令來創建一個新的解決方案文件:
dotnet new sln

這將使用當前目錄的名稱創建一個解決方案文件,或者您可以使用參數-n指定解決方案文件的名稱:

dotnet new sln -n EFCoreMigration
  • 創建兩個項目,一個針對web?類型的WebApp,另一個針對classlib類型的DataAccess?
dotnet new web -o WebAppdotnet new classlib -o DataAccess

要查看每個可用的項目模板,可以使用以下方法列出它們:

dotnet new -l
  • 將這兩個項目添加到解決方案中:
dotnet sln add WebAppdotnet sln add DataAccess

注意,如果不指定解決方案名稱,它將使用默認名稱(即當前目錄的名稱)。完整的命令可以像:

dotnet sln [solution name] add  WebApp

或者,您也可以指定項目文件的完整路徑,例如:

dotnet sln [solution name] add  WebApp\WebApp.csproj
  • WebApp項目中添加對DataAccess項目的引用:
dotnet add WebApp reference DataAccess

或者,您也可以指定項目文件的完整路徑:

dotnet add WebApp\WebApp.csproj reference DataAccess\DataAccess.csproj 

4.DataAcess創建模型和數據上下文

在這里,我們使用實體框架的代碼優先方法。使用了非常基本的模型。

  • Visual Studio代碼中,打開DataAccess目錄,并將Class1.cs重命名為Book.cs然后在下面鍵入以下代碼:
using System;namespace DataAccess
{public class Book{public int Id { get; set; }public string Name { get; set; }public string Description {get;set;}}
}
  • 在終端中,轉到DataAccess目錄,然后添加Microsoft.EntityFrameworkCore?軟件包(版本5.0.3):
cd DataAccess dotnet new package Microsoft.EntityFrameworkCore -v 5.0.3 
  • Visual Studio代碼中,在DataAccess項目中創建DataContext.cs
using System;
using Microsoft.EntityFrameworkCore;
namespace DataAccess
{public class DataContext: DbContext{public DbSet<Book> Books { get; set; }public DataContext(DbContextOptions options) : base(options){           }protected override void OnModelCreating(ModelBuilder modelBuilder){//Can add constraint, index, check, data type, and even data seed} }
}
  • 確保保存所有更改并編譯DataAccess項目,以通過在終端中輸入以下內容來構建它:
dotnet build

5.WebApp啟動數據庫

  • 在終端中,轉到WebApp目錄,然后添加Microsoft.EntityFrameworkCore.SqlServer(版本5.0.3)。此步驟取決于您使用的數據庫服務器,如果使用的不是MS SQL服務器,則為數據庫服務器找到合適的提供程序包。
dotnet new package Microsoft.EntityFrameworkCore.Sqlserver -v 5.0.3 
  • Visual Studio代碼中,打開WebApp目錄,然后編輯Startup.cs在該ConfigureServices部分中添加數據庫上下文。
 using Microsoft.EntityFrameworkCore;
.......public void ConfigureServices(IServiceCollection services){services.AddDbContext<DataAccess.DataContext>(options =>options.UseSqlServer("Server=localhost;Database=EFCoreMigration;Trusted_Connection=True;"));}

UseSqlServerMicrosoft.EntityFrameworkCore.SqlServer中的擴展方法要使用它,您需要在頂部添加using Microsoft.EntityFrameworkCore。該代碼將使用登錄的用戶帳戶連接到MS SQL Server的本地實例,并創建一個EFCoreMigration數據庫。

  • 除此之外,在Startup.cs添加一個DataContexttoConfigure方法,并通過Database.EnsureCreated()在它們之前執行數據庫相關中間件來確保已創建數據庫。?
public void Configure(IApplicationBuilder app,IWebHostEnvironment env,DataAccess.DataContext dataContext)
{dataContext.Database.EnsureCreated();
  • 確保保存所有更改。在終端中,轉到WebApp目錄并鍵入:
dotnet run
  • 通過使用服務正在監聽的端口運行瀏覽器來檢查應用程序是否正常運行(例如,在我的機器中為http://localhost:5000?https://localhost:5001)。要取消服務,請?單擊+ c
  • 通過使用例如Microsoft Server Management Studio檢查數據庫是否存在于MS SQL Server的本地實例中來實例化EFCoreMigration數據庫。
  • 我沒有顯示的是如何使用DataContext通常使用DataContext只需在控制器構造函數中添加DataContext,并將其分配給控制器中的變量。之后,您可以在控制器中的任何位置使用它。由于該項目只是一個準系統Web應用程序,并且沒有WebAPIMVCRazorBlazor中間件,并且已配置端點,因此可以通過調用HttpContext?在中間件中傳遞的對象來在服務中注冊DataContext。下面是示例,請參見context.RequestServices.GetService<DataAccess.DataContract>()您可以重新運行該應用程序,然后檢查瀏覽器,該瀏覽器現在將顯示圖書數量。請注意,您不能使用?Configure?方法中傳遞的DataContext,因為此對象是在中間件構建階段傳遞的,并且已經被長時間處理了。
public void Configure(IApplicationBuilder app,IWebHostEnvironment env,DataAccess.DataContext dataContext)
{dataContext.Database.EnsureCreated();if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseRouting();app.UseEndpoints(endpoints =>{endpoints.MapGet("/", async context =>{using var dataContext = context.RequestServices.GetService<DataAccess.DataContext>();await context.Response.WriteAsync($"Book Count : {dataContext.Books.Count()}");});});
}

6.添加數據遷移功能

到目前為止,我們已經在代碼中使用了Entity Framework,但是沒有數據遷移功能。在大多數項目中,數據庫可能會隨著時間的推移而發展,因此我們可能需要提出一種隨時間推移更改數據庫的策略。Entity Framework Core具有數據遷移功能,下面是實現此功能的一種方法。

  • 首先,我們需要將EF工具鏈安裝到dotnet命令中。輸入終端:
dotnet tool install --global dotnet-ef --version 5.0.3

net core 依賴注入、這將允許我們運行dotnet ef?命令。

  • 添加Microsoft.EntityFrameworkCore.DesignDataAccess項目。在終端中,轉到DataAccess目錄,然后鍵入:
dotnet add Microsoft.EntityFrameworkCore.Design -v 5.0.3
  • Visual Studio Code中,轉到DataAccess目錄,然后創建DataContextFactory.cs
using System;
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.EntityFrameworkCore;namespace DataAccess
{public class DataContextFactory : IDesignTimeDbContextFactory<DataContext>{public DataContext CreateDbContext(string[] args){var builder = new DbContextOptionsBuilder<DataContext>();//this code will be never executed in runtime only in design timebuilder.UseSqlServer("Server=localhost;Database=EFCoreMigration;Trusted_Connection=True;");return new DataContext(builder.Options);}}
}
  • 在終端中,轉到DataAccess目錄,鍵入:
dotnet ef migrations add InitialSchema

它將創建包含三個文件的Migrations目錄:

    • [yyyyMMddHHmmss] _InitialSchema.cs
    • [yyyyMMddHHmmss] _InitialSchema.Design.cs
    • DataContextModelSnapshot.cs

InitialSchema?有兩個方法,UpDown。當將遷移應用于數據庫時,將執行Up;當從數據庫中刪除遷移時,將執行Down。如果遷移應用到最新的遷移,則DataContextModelSnapshot包含數據庫模型的快照。因此,如果添加或刪除了新的遷移,則DataContextModelSnapshot.cs將被覆蓋。

  • 遷移功能可以通過在Startup.cs進行設置來即時應用數據庫更改。在Visual Studio代碼中,打開WebApp目錄,然后編輯Startup.cs更改dataContext.Database.EnsureCreate()dataContext.Database.Migrate()
  • 刪除EFCoreMigration以前創建的數據庫。確保保存所有更改,然后轉到終端并運行Web應用程序。
dotnet run
  • 成功運行該應用程序后,請檢查數據庫EFCoreMigration該數據庫將有一個名為dbo.__EFMigrationsHistory的表該表的列為:MigrationIdProductVersionProductVersion列由實體框架在內部使用并反映EntityFrameworkCore版本,其MigrationId?值的格式為[yyyyMMddHHmmss] _ [遷移名稱]

7.更改數據庫模型

啟用數據遷移后,下一個問題是必須對數據庫模型進行更改時該怎么做。當然,數據庫模型的變化范圍很大,而且并非所有變化都具有相同的復雜性。但是,對于常見的更改情況,以下過程應該足夠了。

  • 可以對數據模型進行更改,請注意不要進行重大更改。
  • 可以對DataContext中的OnModelCreating方法進行更改
  • 在終端中,轉到DataAccess目錄,鍵入:
dotnet ef migrations add [Your Own migration name]
  • 如通常部署一樣,Startup.csMigrate方法將自動將遷移應用于最新更改。
  • 如果要回滾上一次遷移,請鍵入:
dotnet ef migrations remove

然后,像平常一樣部署。

https://www.codeproject.com/Articles/5294835/EF-Core-5-Data-Migration-in-NET-5-in-a-Separate-Li

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/2/107873.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息