EF Core 2.1路线图:视图、GROUP BY和惰性加载
Entity Framework Core一直追隨著初始Entity Framework的發展,并不斷推陳出新。它首先推出的是對視圖的支持,這聽起來有些聳人聽聞。在即將推出的EF Core 2.1之前,EF Core并未對數據庫視圖提供官方的支持,也不支持缺少主鍵的數據庫表,盡管后一種情況十分罕見。
EF Core 2.0提供了一種變通方案。開發人員可以使用ROW_NUMBER創建一個代理主鍵,和聲明數據庫表一樣去聲明視圖。此后,就可以將視圖視為數據庫表,配置數據庫的上下文。
但是開發人員不能修改視圖返回ROW_NUMBER,因為列的組合并非是唯一的。開發人員可以使用Key屬性隨機標記列,然后使用AsNoTracking回避EF的緩存邏輯,以免遺棄了一些“重復”的行。
在EF Core 2.1中,支持采用另一種做法。開發人員可以設置視圖的“查詢類型”,或將內聯(inline)SQL設置為“只讀”的。這樣,不再需要數據庫表必須具有主鍵。
對GROUP BY的支持
在EF Core中,另一個出乎意料的限制是不支持生成SQL中的GROUP BY操作。當前,整個數據集在傳送到客戶端后,EF Core需在內存中執行分組操作。和在數據庫中執行分組操作相比,EF Core的操作將會導致明顯更高的網絡、內存和CPU占用。
隨著EF Core 2.1的發布,分組操作的執行變通為在視圖中或內聯SQL中進行。之后,開發人員可以使用上述解決方法,即將視圖看成是數據庫表。
惰性加載(Lazy Loading)
我們知道,EF Core中討論最為激烈的特性就是惰性加載。雖然有一些開發人員樂此不疲,但也另有一些人將其視洪水猛獸,認為其中充斥著大量可導致低性能或運行時意外失敗的陷阱。EF Core 2.1中添加了惰性加載特性,但是有別于我們先前在最初的Entity Framework中所看到的。
要啟用惰性加載,對象中必須具有一個接受Action<object, string>參數的構造函數。集合(Collection)屬性需要遵循如下模式編寫:
public ICollectionPosts {get => _lazyLoader.Load(this, ref _posts);set => _posts = value; }在本例中,_lazyLoader就是上面提及的由構造函數提供的Action對象。Load是一個回調EF Core的擴展函數。
和初始的EF版本一樣,在未來的EF Core版本中,有望無需編寫此類“八股代碼”(boilerplate code)就可實現惰性加載。
事務
EF Core一直支持事務,但僅局限于支持數據庫事務。在下一版本中,開發人員將可以使用System.Transactions命名空間提供的TransactionScope等功能。該特性也稱為“氛圍事務”(ambient transaction),它支持多個資源間協調事務,包括數據庫、消息隊列、Web服務和文件系統等。例如,開發人員可在對事務NTFS硬盤的寫操作失敗的情況下,自動回滾數據庫更改。
值轉換
對值轉換的支持,是ORM中一個常常被低估的特性。簡而言之,該特性處理諸如將枚舉類型按其底層的整數值或字符串表示存儲等問題。但是如果需要ORM支持多種數據庫引擎,事情就變得十分復雜。
假定數據模型中存在無符號整數。部分數據庫原生地支持無符號整數,因此不存在問題。但是諸如SQL Server等數據庫只支持有符號整數。如果需要數據模型同時支持兩者,那么ORM具備處理轉換能力就尤為重要。
在EF Core 2.1路線圖中,更進一步支持插入開發人員定制的轉換邏輯。該特性將支持對屬性值的透明加/解密等特性。
空間數據類型
新路線圖收到的首個反饋,就是再次呼吁支持空間數據類型(Spatial Data Type)。空間數據在SQL Server中表示為Geometry和Geography類型。兩者間的不同之處在于,Geometry用于歐氏(平面)坐標系統,而Geography則用于更為復雜的橢圓坐標系統。
EF Core 2.1對空間數據提供了部分支持。首先,開發需要運行在.NET Framework上,因為.NET Core中并未提供處理空間數據所需的庫。其次,開發人員需要使用視圖或內聯SQL,將幾何和地理數據轉換為WKB(熟知二進制,well-known binary)或WKT(熟知文本,well-known text)。WKB/WKT是表示此類空間數據的工業標準。最后,開發人員可以著手編寫值轉換器(方法如上所述),實現適當的.NET對象與WKB/WKT間的相互轉換。
.NET Core中還規劃了其它一些特性,可參見EF 2.1路線圖的通訊稿。
原文:http://www.infoq.com/cn/news/2018/03/EF-Core-2.1-Road-Map
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結
以上是生活随笔為你收集整理的EF Core 2.1路线图:视图、GROUP BY和惰性加载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Metrics.net + influx
- 下一篇: 拥抱.NET Core系列:Memory