前言
最近很少去學習和探索新的東西,尤其是之前一直比較關注的EF領域,本身不太懶,但是苦於環境比較影響自身的心情,所以遲遲沒有下筆,但是不去學習感覺在精神層面缺少點什么,同時也有園友說EF又更新了,要我再寫一篇,最終經過思想斗爭后,還是花了一點時間去繼續探索。本篇比較理論的去分享最近EF進展,后面有時間會繼續關注EF團隊在EF上的動向,並給出相對應的實例。
EF Core 1.0.0
(1)EntityFramework是微軟在.NET中推薦使用的數據訪問技術,而EntityFramework Core提供了和EF6.x相似的開發者體驗,它也支持LINQ、POCO以及Code First,它也能訪問關系和非關系存儲的數據,但是EF Core比之前的EF版本更加輕量。與此同時,在一開始被構建時就被應用的非常好比如在使用ASP.NET vNext上使用的設備如:Windows應用程序,當然在傳統的.NET領域也是如此。
————————————————————————————————————————————————————————————————
(2)但是我們需要注意的是EF Core在嚴格意義上並未完全和ASP.NET Core捆綁在一起,並且EF Core有許多特性是在ASP.NET使用范疇之外。它是ASP.NET Core整體的一部分,因此作為ASP.NET Core的部分去發布一個穩定的EF Core版本去支持ASP.NET Core確實非常重要。
————————————————————————————————————————————————————————————————
(3)因為EF Core是一個新的代碼庫,所以在過去EF版本中實現的特性並不一定會在EF Core中實現,所以鑒於此,EF團隊給出了在EF Core發布之前需要實現的如下的列表,同時也列出了EF團隊認為非常重要且需要實現的特性,但是,但是,在初始發布EF Core時將並不會啟用。所以這也就意味着:當前在大多數應用程序中使用EF 6.x版本仍然是最佳選擇,直到這些特性在EF Core代碼庫中得到實現。
已實現(Implemented)
如下特性已經實現並且已經包含在官方最后一次正式發布之前。注意:【如下列出的特性可能存在Bugs可能需要EF團隊時間去解決並且這些APIs在第一次正式發布之前仍然可能會有所改變。】
模型(Modeling)
(1)基礎模型(Basic modeling):基於帶get/get屬性的POCO實體。公共屬性來自於基礎類庫如(string、int等)。
(2)關系(Relationship):有導航屬性和外鍵屬性的實體。
(3)隱藏狀態屬性(Shadow state properties):此屬性只是作為模型的一部分,也就是說在CLR類中沒有與之對應的屬性。
(4)唯一性約束和索引(Unique constraints an indexes):定於目標的唯一性約束是否是主鍵的關系。
(5)內置約定(Built-in conventions):構建實體類的初始化模型。
(6)模型驗證(Model validations):檢測模型中無效的模式,並提供有幫助的錯誤信息。
(7)鍵值的產生:包括后台以及數據庫中生成的。
(8)關系(Relationnal):允許實體被映射到表中的列。
變更追蹤(Change Tracking)
(1)快照式變更追蹤(Snapshot change tracking):當與數據庫中進行交互時記錄實體的原始值。
(2)訪問跟蹤狀態(Access tracked state):通過DbContext.Entry和DbContext.ChangeTracker訪問實體的狀態。
(3)附加分離的實體圖/(Attach detached entities/graphs):為了保存新的實體或者修改的實體,通過DbContext.AttachGraph的APIs將實體附加到上下文中。
保存(SaveChanges)
(1)基本的保存功能(Basic save functionality):將改變的實體與數據庫處於同步狀態。
(2)樂觀並發(Optimistic Concurrency):防止當從數據庫中獲取數據時,數據被其他用戶所覆蓋。
(3)異步保存(Async SaveChanges):當調用SaveChanges時數據庫需要作出相應的操作,此時釋放當前線程,來處理SaveChanges發出的命令。
(4)事務(Transactions):當SaveChanges時是原子性即要么提交全部成功或者對數據庫數據沒有作出任何改變,對於transactions有相關的APIs來使得在同一個上下文實例中共享transactions。
(5)批處理語句(Batching statements):通過批處理多個INSERT/UPDATE/DELETE命令到單一的往返到數據庫提供更好的性能。
查詢(Query)
(1)支持基礎LINQ(Basic LINQ Support):提供LINQ處理來自數據庫的數據。
(2)混合的客戶端或者服務器端評估(Mixed client/server evaluation):讓查詢包含不會在數據庫中進行任何評估的邏輯,與此同時,從數據庫中返回到內存的數據必須被評估。
(3)不會追蹤(No Tracking):當上下文不需要監控實體實例的改變時(也就是說當我們只是讀取數據時),此時將啟用快速查詢。
(4)飢餓加載(Eager loading):當查詢關聯的數據時通過使用Include和ThenInclude方法來標識這些相關聯的數據需要被加載。
(5)異步查詢(Async Query):當數據庫處理查詢時釋放當前線程來處理其他請求。
(6)常見的BCL翻譯功能(Translation of common BCL functions):當使用LINQ時,啟動這些功能語句將會被翻譯成特定的數據庫查詢語言。
(7)原始SQL查詢(Raw SQL Query):提供Dbset.FormSql來使用原始SQL查詢來獲取數據。當然這些查詢也可以用LINQ組成。
數據庫架構管理(Database schema management)
(1)創建和刪除數據庫的APIs(Database creation/deletion)APIs:主要是為了在沒有使用數據遷移的前提下快速創建和刪除數據庫。
(2)數據庫錯誤頁(Database error page):是對於ASP.NET 5的一個中間件,為了提供與數據庫有關異常的幫助。
(3)有關數據庫遷移(Relational database migrations):允許數據庫架構隨着模型的變化而變化。
提供的數據庫(Database providers)
(1)EntityFramework.SqlServer:連接Microsoft SQL Server 2008以上的數據庫。
(2)EntityFramewrok.Sqlite:連接一個SQL Lite 3數據庫。
(3)EntityFramework.InMemory: 並沒有連接到一個真正的數據庫主要是被用來測試。
平台(Plateforms)
(1)所有.NET(Full .NET):包括控制台、WPF、WinForm、ASP.NET 4等等。
(2)ASP.NET 5:包括所有.NET和.NET Core。
(3)所有Windows平台(UWP):應用程序可以利用SQLite來訪問本地數據。
進行中(In Progress)
以下特性正在實現中,在某些場景下可能有效,可能還不太完整使用起來仍有一些限制。
模型(Modeling)
(1)數據注入(Data Annotaions):添加特性到實體類或者屬性以此來影響到實體。
(2)TPH繼承模式(TPH inheritance pattern):通過數據庫中給定的記錄中的辨別字段來識別在繼承上的實體類型並保存到一個單表中。
跨領域性質(Cross-cutting quality)
(1)文檔(Documentation):將發展有關EF Core的文檔【鏈接:EntityFramework.Docs】
(2)智能提示文檔(IntelliSense documentation):當在Visual Studio中使用EF APIs時會得到智能提示。
(3)以往APIs(APIs review):由於涉及到以前的EF APIs,所以將會給出一份干凈而且一致的APIs。
性能(Performance)
(1)附加覆蓋(Additional converage):通過測試組件可能會有額外的覆蓋。
(2)性能改善(Performance improvements):性能瓶頸正在進行中。
查詢(Query)
導航屬性翻譯(Navagation property translation):允許通過LINQ直接點出導航屬性的字段,如(Products.Where(p=>p.Category.name=="cnblogs"))。
逆向工程(Reverse engineer)
允許從現有的關系數據庫架構逆向得到EF模型。
平台(Plateforms)
EF Core當前可以在蘋果和Linux上工作,但是正在向更穩定的方向上提高。
EF Core 1.0.0日程表
在1.0.0發布之前以下已經得到實現,但是現在還未正式啟用。
(1)允許(如遷移)工具找到上下文類型並實例化來創建模型和識別連接其連接的數據庫。
(2)為一般應用部署時,部署數據庫發生的改變提供更好的支持。
(3)提供當父親刪除時其孩子也應該刪除的級聯刪除。
(4)在ASP.NET 5中初始化版本日志記錄比較簡單,為了后續記錄的更新提供更友好的日志記錄。
未實現特性(Backlog Features)
EF Core將是EF團隊推薦使用的EF版本,但是有一個前提,那就是還需實現如下特性EF Core才是許多應用程序的最佳選擇,特別是在例如UWP平台上EF 6.x無法工作,當然了對於絕大數應用程序來說,缺少以下特性也同樣使得EF 6.x是個不錯的選擇。
查詢(Query)
(1)顯示加載(Explicit loading)。
(2)子查詢(Sub queries)。
(3)將Group by轉換為SQL(Group by translation SQL)。
日志(Logging)
(1)良好的日志記錄。
(2)結構化日志記錄。
模型(Modeling)
復雜/值類型(Complex/value Type)。
更新模型(Update model)
從數據庫中更新數據模型。
變更追蹤(Change Tracking)
(1)補充在EF6.x中缺少的APIs(如:Reload【重新加載】、GetModifiedProperties【獲取修改的屬性】等等)。
(2)對於關系的Entry方法。
(3)對於數據庫值的Entry方法。
特定關系(Relational specific)
(1)基於存儲過程的CUD。
(2)彈性連接。
高優先級特性(High priority features)
盡管在上述對於未實現特性已經列出了一個清單,但是對於絕大多數應用程序來說,因為沒有這些高優先級特性,正因如此使得EF Core將是一個比較令人拍手叫好的發布版本。
模型(Modeling)
(1)隱藏狀態實體(Shadow state entities)。
(2)映射到方法、可能的屬性模式、不可變對象等等。
(3)可視化模型(Visualize model)。
(4)支持可組合的功能(Composable functions support)。
(5)自定義約定(Custom conventions)
(6)實體或者表拆分(Entity/Table splitting)。
(7)簡單類型轉換(比如從string->xml)。
(8)沒有添加實體的多對多關系(many:many relationships without join entity)。
變更追蹤(Change Tracking)
通知變更追蹤(Notification change tracking)。
增刪改查(CRUD)
(1)基本數據保存(Seed data)。
(2)延遲加載(Lazy loading)【根據反饋來看】。
(3)簡單的ETag式並發令牌支持(Simple ETag-style concurrency token support)。
(4)飢餓加載改善(Eager loading)【比如:匯總、過濾、派生類等等】。
(5)用於查詢和更新的簡單攔截機制(Simple interception mechanisms for query and updates)。
提供者(Providers)
(1)ATS。
(2)Redis。
(3)其他非關系數據庫。
遷移(Migrations)
基於公共語言架構的非DNX項目。
指定提供者(Provider specific)
通過配置文件指定提供者。
結語
EF Core原名為EntityFramework 7,至於更名大概主要有兩點,一是為了更好的跨平台,二是為了提高EF的性能。從而給開發者更好的使用體驗以及讓更多的.NET開發者去使用EF Core,上述也已經講到,EF Core會更加輕量同時也會更多的去關注它的性能瓶頸,至此或許關於EF性能的吐槽會少一點吧,讓我們拭目以待。