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?


星期四, 10月 22, 2015

[MSSQL] 把查詢多筆 row 的 Geometry 合起來,用.UnionAggregate()!

口白:
流動的水沒有形狀,漂流的風找不到蹤跡,任何案件的 Coding 都取決於心
唯一看透真相的是,外表看似卜朧共,智慧卻低於常人的 名卜朧共 刻爛
(謎之音:把 Code 刻到爛簡稱刻爛.爛..爛...)
Music:
#表升半音 []表高八度
4 3 2 6 4 2 3 #6 6 5 4 5 4 5 6 4 3 2 5 4 3 4 2 6 4 5 [2] [1] #6 6 5 6
4 3 2 6 4 2 3 #6 6 5 4 5 4 5 6 4 3 2 4 3 2 4 2 6 4 5 [2] #6 6 5 6
口白:
刻爛:真実はいつも一つ!

這次是我們要在 MS SQLServer 資料庫裡,把多筆查到的 資料列 row 的 Geometry 欄位通通黏起來!

Geometry 要怎麼將多筆查到的資料列 row 的 Geometry 黏起來呢?
根據卜朧共的腦袋,第一個念頭,找個漿糊函數阿,這簡單...

正所謂,外事不決問谷哥~內事不決尋百度~房事不決覓天涯~
(無殼蝸牛皆是天涯淪落人阿!所以可能找房子要問天涯...
先問谷哥!先找微軟!找他的可用函數!
一開始的想法是翻了 ogc 函數 STUnion() 這東西不合用阿!

NOKIA說科技始於人性! 卜朧共深信程式始於惰性!一定有更懶的方法!

谷哥~果然沒讓我失望~找到了 SQL SERVER – Beginning SQL 2012 – Spatial Unions and Collections – Abstract from Joes 2 Pros Volume 3 這篇~
一個 UnionAggregate() 函數就搞定了~
(謎之音:就只會找谷哥!你還有什麼貢獻!)

參考:

星期二, 9月 01, 2015

[MSSQL] Geometry 裡面畫圈圈,用.STBuffer()、STGeomFromText() 搭配wkt 的CURVEPOLYGON與CIRCULARSTRING!

口白:
流動的水沒有形狀,漂流的風找不到蹤跡,任何案件的 Coding 都取決於心
唯一看透真相的是,外表看似卜朧共,智慧卻低於常人的 名卜朧共 刻爛
(謎之音:把 Code 刻到爛簡稱刻爛.爛..爛...)
Music:
#表升半音 []表高八度
4 3 2 6 4 2 3 #6 6 5 4 5 4 5 6 4 3 2 5 4 3 4 2 6 4 5 [2] [1] #6 6 5 6
4 3 2 6 4 2 3 #6 6 5 4 5 4 5 6 4 3 2 4 3 2 4 2 6 4 5 [2] #6 6 5 6
口白:
刻爛:真実はいつも一つ!

這次是我們要在 MS SQLServer 資料庫裡的 Geometry 欄位內畫圈圈!

Geometry 要怎麼畫圈圈呢?
根據卜朧共的腦袋,第一個念頭,圓圈畫法就是線段畫一圈阿,這簡單
跑個公式把圓上的每個點都算出來~化成一個圓的面就搞定啦...
可是目前數學只剩下簡單加減乘除的程度耶....另想它法...
跑個公式把圓上的每個點都算出來~化成一個圓的線段就搞定啦...
可是再次強調數學只剩下簡單加減乘除的程度耶....又只能另想它法...

好吧!科技始終始於惰性~我相信有更簡單的辦法可以處理掉
圓要怎麼畫呢?拿出了圓規觀察吧....
先取得一個圓心,拉出半徑,轉一圈~ya 圈圈畫出來了...
好吧~用點的方式來畫圓看看吧!

方法一:
DECLARE @gPOINT geometry = 'POINT(1 0 )';
Select @gPOINT.STBuffer(0.8),@gPOINT.STGeometryType(), @gPOINT.STBuffer(0.8).STGeometryType() ;

說明:
1. 定義一個 Geometry 變數,給它中心點
2. 利用 STBuffer() 函數來畫吧,半徑給 0.8


結果驗證想法是對的~人還是懶一點複雜的事情還是給資料庫去處理吧,果然程度不好只能靠懶來征服!

不行!看到魚兒逆流而上!人要上進阿!
查吧~先查MSDN吧,傳送門 原本的想法一定還是可以靠懶來解決!

方法二:
DECLARE @gCURVEPOLYGON geometry = 'CURVEPOLYGON(CIRCULARSTRING(0 0, 1 1, 2 0, 1 -1, 0 0))';
Select @gCURVEPOLYGON , @gCURVEPOLYGON.STGeometryType();

說明:
1. 定義一個 Geometry 變數,給它一個 wkt 的 CURVEPOLYGON 字串,主要是由四個弧形線段 (CIRCULARSTRING)所組成!




看!!!為什麼人要上進?果然最懶的方法是最快的方式!
看!!!科技果然始於惰性!為什麼要脫褲子放屁?

想到的理由:萬一剉賽才不用洗褲子!

參考文獻︰
1. STBuffer()
2. CIRCULARSTRING
3. CURVEPOLYGON


星期四, 9月 08, 2011

資料表的查詢

Oracle:
Select table_name from user_tables

PostgreSQL:
select * from pg_stat_user_tables WHERE schemaname='public'
select relname from pg_stat_user_tables WHERE schemaname='public'