在分開的 Class Library 專案中使用 Entity Framework Core Database First

Entity Framework Core Database First at separate class library project
公司有一個新的專案,不大也不小,想說剛好用來上手一下 ASP.NET Core,結果還沒開始就已經撞得滿頭腦,差點就要放棄了,幸好在堅持一下就嘗試出來了,這件事花了我一整天搜尋與嘗試,特地紀錄一下
首先必須要說的是 Entity Framework Core Database First 的方式,工具對其之支援真是有夠差,完全必須手動新增某些關鍵設定才有辦法成功執行
環境:Visual Studio 2017 Update 5.1、 .Net Framework 4.7.1 與 .NetCore 2.0
首先當然是新增一個 .NetCore Class Library 專案

新增 .NetCore Class Library 專案
專案新增完畢後,先進行必要的 nuget package 安裝,安裝以下四個 nuget package,安裝版本請務必選擇相同版本,我這邊安裝的都是 2.0.1
安裝完後,接下來還有一個 nuget package 需要安裝,但其特殊性必須額外拿出來說
Install-Package Microsoft.EntityFrameworkCore.Tools.DotNet
先來看一下安裝需求,2.0.1 版本所需求之 Microsoft.NETCore.App 為大於等於 2.0.3,但是一開始新增 Class Library 專案之 Microsoft.NETCore.App 版本為 2.0.0,所以無法安裝
20171213 實驗時,.NetCore 2.1.0-preview2-25624-02 連空專案都 Build 不過,直接放棄

Microsoft.EntityFrameworkCore.Tools.DotNet
想要使用 Nuget Package 管理工具升級時,發現 Microsoft.NETCore.App 被鎖住無法升級或是降級

Microsoft.NETCore.App
只能用文字編輯器打開 ClassLibrary1.csproj 直接編輯,將其版本修改為 2.0.3,如下並存檔
修改完畢後,就可以安裝 Microsoft.EntityFrameworkCore.Tools.DotNet Package 了
安裝完畢後,再次用文字編輯器打開 ClassLibrary1.csproj 進行編輯,這次要加的是關係到 Entity Framework Core 是否能正確動作的關鍵設定:DotNetCliToolReference
加入兩行 DotNetCliToolReference 後,Entity Framework Core 就可以正確動作了

Complete
如果還有問題的話,可以去安裝 .NET Core CLI,有時會是工具連組態都沒有設定好
就因為 Visual Studio 不會自動幫你加入 DotNetCliToolReference 就花費了一整天的時間..
在 Visual Studio 內使用 Package Manager Console 之指令
Scaffold-DbContext "Connection String" Microsoft.EntityFrameworkCore.SqlServer -outputdir Models
在 CMD 視窗之指令
dotnet ef dbcontext scaffold "Connection String" Microsoft.EntityFrameworkCore.SqlSe rver --output-dir Models
參考:
[No executable found matching command "dotnet-ef" even after adding CLI · Issue #8996 · aspnet… I want to Migrate my Database with Models. I am using EF Core 2.0 Preview. dotnet ef migrations add InitialCreate…github.com](https://github.com/aspnet/EntityFrameworkCore/issues/8996 "https://github.com/aspnet/EntityFrameworkCore/issues/8996")
[Getting Started on ASP.NET Core - Existing Database - EF Core In this walkthrough, you will build an ASP.NET Core MVC application that performs basic data access using Entity…docs.microsoft.com](https://docs.microsoft.com/en-us/ef/core/get-started/aspnetcore/existing-db "https://docs.microsoft.com/en-us/ef/core/get-started/aspnetcore/existing-db")

![[IT 鐵人賽] ASP.NET Core 與 Log 紀錄和追蹤的愛恨交織 - Day 05 - Elmah - 02](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1776070454149%2Fa0702417-5357-4217-a572-7ba53ea36735.png&w=3840&q=75)
![[IT 鐵人賽] Azure Data Service - Day 04 - Cognitive Service - 辨識 - Video Indexer](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1776070473207%2F6423fd4a-4041-4bb2-b918-4cfe3f9aea5e.png&w=3840&q=75)