google-code-prettify

星期六, 11月 09, 2019

【EF】EntityFrameworkCore 存取空間資料 Geometry 欄位…私、失敗しないので(我,絕對不會失敗)

劇情講述的是:
直言敢諫的派遣工 EntityFrameworkCore,討厭結群、討厭權力、討厭束縛,以其專業以及高超的技術作為武器,勇於挑戰白色巨塔封建體系的故事。

不需要資料庫的事情 EntityFrameworkCore 一律不做,
像是幫教授寫論文… いたしません(不幹)、
參加院長巡房… いたしません(不幹)、
配合掩護小三等等全都… いたしません(不幹),
且一定要準時下班,若要額外加班、要另外收高額費用…

自從 EntityFramework 誕生,也過了好幾個年頭…

維基百科:
Entity Framework (又稱ADO.NET Entity Framework)
是微軟以 ADO.NET 為基礎所發展出來的物件關聯對應 (O/R Mapping) 解決方案,
早期被稱為 ObjectSpace,
ADO.NET Entity Framework 以 Entity Data Model (EDM) 為主,
將資料邏輯層切分為三塊,
分別為 Conceptual Schema, Mapping Schema 與 Storage Schema 三層,
其上還有 Entity Client,Object Context 以及 LINQ 可以使用。

第一版 發行日期:2008-8-11 Entity Framework (EFv1) 包含在 Visual Studio 2008 Service Pack 1 以及 .NET Framework 3.5 Service Pack 1 中發表。
第二版 發行日期:2010-4-12 名為:Entity Framework 4.0 (EFv4) 。
第三版 發行日期:2011-4-12 名為:Entity Framework 4.1  開始支援 Code First。
…  光陰似箭,歲月如梭 …(謎之音:偷懶…)
第6版 發行日期:2013-10-17

微軟隨後決定對 .NET 跨平台化,並將其引入Linux,OSX和其他地方,
這意味著 Entity Framework 的下一個版本將被完全重寫。
2016-6-27 作為 Entity Framework Core 1.0 與 ASP.NET Core 1.0 和.NET Core 1.0 發布。
它最初命名為Entity Framework 7,但經過重命名以強調它是完全重寫而不是增量升級,並且不替代EF6。

2017-8-14 發布 EF Core 2.0、Visual Studio 2017 15.3、ASP.NET Core 2.0
2019-9-23 發佈 EF Core 3.0、Visual Studio 2019 16.3、ASP.NET Core 3.0

如何讓 EF Core 讀取 Geometry or Geography?
NetFramework 4.7.2,.NetCore 2.0,.NetStarndard 2.0:
===================================================================
Step 0: 專案檔修改
修改 .csproj,使其支援 .NetFramework、.NetCore、.NetStarndard多個版本框架,
netstandard 要放在最後面,不然會說沒有 runtime,無法執行
修改範例如下:
<TargetFrameworks>net472;netcoreapp2.0;netstandard2.0;</TargetFrameworks>

Step 1: 需先從Nuget安裝 or 用 PackageManager 下指令安裝
Nuget安裝 要對應 EF Core 2.0 使用的版本套件
1.Microsoft.EntityFrameworkCore
2.Microsoft.EntityFrameworkCore.Design
3.Microsoft.EntityFrameworkCore.SqlServer
4.Microsoft.EntityFrameworkCore.SqlServer.NetTopologySuite
5.Microsoft.EntityFrameworkCore.Tools
6.NetTopologySuite
7.NetTopologySuite.Core

用 PackageManager 下指令安裝:
打開套件管理員主控台:Visual Studio → 工具 → NuGet套件管理員 → 套件管理員主控台
PM> Install-Package Microsoft.EntityFrameworkCore -Version 2.2.6
PM> Install-Package Microsoft.EntityFrameworkCore.Design -Version 2.2.6
PM> Install-Package Microsoft.EntityFrameworkCore.SqlServer -Version 2.2.6
PM> Install-Package Microsoft.EntityFrameworkCore.SqlServer.NetTopologySuite -Version 2.2.6
PM> Install-Package Microsoft.EntityFrameworkCore.Tools -Version 2.2.6
PM> Install-Package NetTopologySuite -Version 1.15.3
PM> Install-Package NetTopologySuite.Core -Version 1.15.3

Step 2: 將目錄移到有 .csproj 檔案的目錄位置
打開套件管理員主控台:Visual Studio → 工具 → NuGet套件管理員 → 套件管理員主控台
輸入
PM> ls 指令 (好親切…微軟 UNIX/Linux 化…)
PM> cd 指令將目錄移到有 .csproj 檔案的目錄位置

Step 3:(只需做一次)
"dotnet ef" 必須安裝為全域或本機工具。 大部分的開發人員會使用下列命令,以全域工具的形式安裝 dotnet ef:
打開套件管理員主控台:Visual Studio → 工具 → NuGet套件管理員 → 套件管理員主控台
PM> dotnet tool install --global dotnet-ef --version 3.0.0
(就是裝最新版…就是可以用咧…)

Step 4:由資料庫反向工程,產生資料庫存取類別庫
PM> dotnet ef dbcontext scaffold "Data Source=伺服器;Initial Catalog=資料庫;User ID=填帳號;Password=填密碼;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False" Microsoft.EntityFrameworkCore.SqlServer -d -f -o 輸出目錄

這樣就搞定囉

.NetCore 3.0,.NetStarndard 2.1:
===================================================================
Step 0: 專案檔修改
修改 .csproj,使其支援 .NetFramework、.NetCore、.NetStarndard多個版本框架,
netstandard 要放在最後面,不然會說沒有 runtime,無法執行
修改範例如下:
<TargetFrameworks>netcoreapp3.0;netstandard2.1;</TargetFrameworks>

Step 1: 需先從Nuget安裝 or 用 PackageManager 下指令安裝
Nuget安裝 要對應 EF Core 2.0 使用的版本套件
1.Microsoft.EntityFrameworkCore
2.Microsoft.EntityFrameworkCore.Design
3.Microsoft.EntityFrameworkCore.SqlServer
4.Microsoft.EntityFrameworkCore.SqlServer.NetTopologySuite
5.Microsoft.EntityFrameworkCore.Tools
6.NetTopologySuite

用 PackageManager 下指令安裝:
打開套件管理員主控台:Visual Studio → 工具 → NuGet套件管理員 → 套件管理員主控台
PM> Install-Package Microsoft.EntityFrameworkCore -Version 3.0.0
PM> Install-Package Microsoft.EntityFrameworkCore.Design -Version 3.0.0
PM> Install-Package Microsoft.EntityFrameworkCore.SqlServer -Version 3.0.0
PM> Install-Package Microsoft.EntityFrameworkCore.SqlServer.NetTopologySuite -Version 3.0.0
PM> Install-Package Microsoft.EntityFrameworkCore.Tools -Version 3.0.0
PM> Install-Package NetTopologySuite -Version 2.0.0

Step 2: 將目錄移到有 .csproj 檔案的目錄位置
打開套件管理員主控台:Visual Studio → 工具 → NuGet套件管理員 → 套件管理員主控台
輸入
PM> ls 指令 (好親切…微軟 UNIX/Linux 化…)
PM> cd 指令將目錄移到有 .csproj 檔案的目錄位置

Step 3:(只需做一次)
"dotnet ef" 必須安裝為全域或本機工具。 大部分的開發人員會使用下列命令,以全域工具的形式安裝 dotnet ef:
打開套件管理員主控台:Visual Studio → 工具 → NuGet套件管理員 → 套件管理員主控台
PM> dotnet tool install --global dotnet-ef --version 3.0.0
(謎之音:你除了會複製貼上…你還會啥)

Step 4:由資料庫反向工程,產生資料庫存取類別庫
PM> dotnet ef dbcontext scaffold "Data Source=伺服器;Initial Catalog=資料庫;User ID=填帳號;Password=填密碼;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False" Microsoft.EntityFrameworkCore.SqlServer -d -f -o 輸出目錄

這樣就搞定囉…
就會產生 包含 Geometry or Geography 類別囉

接下來怎麼用…小愛同學努力了解中…

未完待續…

【參考文獻】
維基百科 中文 Entity_Framework
維基百科 英文 Entity_Framework
微軟繁中 空間資料
微軟英文 空間資料
安裝 Entity Framework Core
.NET standard
Spatial Mapping with NetTopologySuite
NetTopologySuite: InvalidOperationException #18172
Finding Nearby Users with Entity Framework Core Spatial Data
Entity Framework Core support for SQL Spatial Data Types - DBGeography?