[2core]EFCore對象關係映射

遷移問題

新建一個webapi項目,然後安裝EFCore類庫,以及ERCore.SqlServer類庫,像使用ASP.NET 4.x一樣採用DBFirst模式,創建ADO.NET實體數據模型。步驟沒有錯,可此時VS2022提示“項目的目標框架不包含實體框架運行時程序集。請查看項目屬性頁中的目標框架信息”,出現這個彈窗提示,我基本已經知道,EF裏可以使用的“ADO.NET實體數據模型”,在EFCore中已經不能使用。鑑於巨硬一貫的風格,肯定是搞出了一套全新的工具,那就去官網查查,果然新工具出現在“ EFCore 》管理數據庫架構 》反向工程 ”裏。

 

解決方案

反向工程是基於數據庫架構搭建實體類型類和 DbContext 類基架的過程。 可使用 EF Core 包管理器控制檯 (PMC) 工具的 Scaffold-DbContext 命令或 .NET 命令行接口 (CLI) 工具的 dotnet ef dbcontext scaffold 命令執行這一過程。
要使用反向工程必須滿足以下條件:
1)在進行反向工程之前,需要安裝 PMC 工具(僅限 Visual Studio)或 CLI 工具。 
2)在要搭建基架的項目中安裝 Microsoft.EntityFrameworkCore.Design 的 NuGet 包。
3)還需要爲要進行反向工程的數據庫架構安裝適當的數據庫提供程序。
反向操作執行命令,分爲兩種類型
.NET Core CLI:dotnet ef dbcontext scaffold "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Chinook" Microsoft.EntityFrameworkCore.SqlServer
Visual Studio:Scaffold-DbContext 'Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Chinook' Microsoft.EntityFrameworkCore.SqlServer

操作流程

經過上述遷移問題和解決方案的分析學習,就可以動手實際操作一下了。
1.採用“ADO.NET實體數據模型”嚮導生成ORM模型和錯誤提示

  

 

2.採用全新的命令行式工具

  

 注意事項:

1)注意解決方案裏,啓動項目已從“jks.core.test.databases”切換成“jks.core.test.databases.entities”
2)注意程序包管理器控制檯,默認項目已從“jks.core.test.databases”切換成“jks.core.test.databases.entities”
3)PM>命令行,主要構成是 Scaffold-DbContext '數據庫連接字符串' Microsoft.EntityFramworkCore.SqlServer。還可以添加其他參數,請自信查閱官方文檔。
4)要使用反向工程生成ORM映射對象,上圖中jks.core.test.databases.entities項目需要安裝以下程序集
  a)Microsoft.EntityFrameworkCore
  b)Microsoft.EntityFrameworkCore.Design
  c)Microsoft.EntityFrameworkCore.SqlServer
  d)Microsoft.EntityFrameworkCore.Tools
5)爲什麼要把反向工程產物輸出到獨立的項目?因爲這些依靠工具自動生成的程序文件代碼,最好不要改動,官網也給出了警告說:“如果從數據庫中再次對模型進行反向工程,則對這些文件所做的任何更改都將丟失”。做大型項目肯定採用DBFirst模式,依據實際業務需求增刪改數據表結構是不可避免之事,因此爲了確保這些自動生成代碼與數據表的一致性,故而將它們單獨放在一個項目中管理。
6)EF還提供了其他作用的程序集,具體功能的使用可以自行研究。

 

TransactionScope 

在面向數據庫編程的三層架構中,對於操作多張數據表的複雜業務邏輯編碼,一般會在BLL層採用TransactionScope把功能邏輯代碼包裹起來,然後一併提交到數據庫。這種做法即實現了實際需求,又不會破壞代碼結構和文件的獨立性,所以,從EF切換成EFCore,我是十分關注TransactionScope類的,生怕被拋棄,結果很開心,巨硬沒有拋棄這個類。

 

EFCore數據庫腳本輸出到控制檯

在EF中要把發送給數據庫的SQL腳本輸出到控制檯,只需要添加一行代碼“DbContext.Database.Log = new Action<string>(o => { Console.WriteLine(o); });”即可,到了EFCore則不同,如下:

    public partial class HRM_WACContext : DbContext
    {
        //輸出到debug輸出
        public static readonly ILoggerFactory LoggerFactoryDebug = new LoggerFactory(new[] { new DebugLoggerProvider() });
        // 輸出到Console
        public static readonly ILoggerFactory LoggerFactoryConsole = LoggerFactory.Create(builder => builder.AddConsole());

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            //僅用於Development環境
            optionsBuilder.UseLoggerFactory(LoggerFactoryConsole);
        }
    }

注意事項:
1)引入包:Microsoft.Extensions.Logging
2)引入包:Microsoft.Extensions.Logging.Console
3)引入包:Microsoft.Extensions.Logging.Debug
 

 

總結

畢竟要實現跨平臺,改變是不可避免的,看過自動生成的代碼,確實要比上一代EF生成的代碼更簡潔、清晰。只是對於養成使用圖形化嚮導的程序員來說,命令行式操作工具不夠方便。總之,新式ORM工具是非常不錯的。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章