摘要:實體框架程式碼優先CTP5發佈
[原文發表位置] Announcing Entity Framework Code-First (CTP5 release)
[原文發表時間] December 08, 2010 1:39 AM
本周資料組發佈了新Entity Framework Code-First (EF Code-First)類別庫的CTP5版本。 EF Code-First提供了一個很好的以程式碼為中心的開發工作流程來處理資料。它使你能:
- 開發時不需要打開 Designer 或定義XML映射文件;
- 只需編寫 「Classic 類別」來定義模型對象而無需定義基底類別;
- 使用「配置約定」方式保持與資料類別庫的持久化映射,無需任何明確設定;
- 選擇性地覆蓋常規對映,用流暢(Fluent)程式碼API完全客制持久化映射。
我是Entity Framework Code-First的超級粉絲,還在今年夏天寫了幾個相關的文章:
- 用實體框架4實現程式碼優先的開發(7月16日)
- Entity Framework Code-First: 自訂資料類別庫模式映射(7月23日)
- 在現有資料類別庫上運用Entity Framework Code-First(8月3日)
相對CTP4,今天的新CTP5發佈版提供了幾個重要改進, 並且它將是最終版本前的最後一個預覽版。我們將會在明年(2011)第一季發佈Entity Framework Code-First的最終版。它能與所有的.NET 應用型別相容(包括ASP.NET網頁和ASP.NET MVC專案)。
安裝EF Code First:
你可以選擇以下兩種方法中的任一種來安裝並使用Entity Framework Code-First:
方法1:下載和運行一個安裝程式。裝好後就可以在你的專案中引用其中的 EntityFramework.dll 程式集。
或:
方法2:使用Visual Studio內的NuGet Package Manager在專案中下載和安裝EF code First。這只需要很簡單地打開Visual Studio中的NuGet Package Manager Console(檢視-> 其他視窗-> Package Manager Console),然後輸入 「Install-Package EFCodeFirst」:
在Package Manager Console中輸入「Install-Package EFCodeFirst」會使NuGet去下載EF Code First套件,並將其加到目前專案:
這會自動加一個EntityFramwork.dll的引用到專案中:
NuGet幫你安裝EF Code First,讓你幾分鐘內就可以使用它了。EF Code First最終版發佈後,你將只需輸入「Update-Package EFCodeFirst」就可以將現有的專案升級成最終版。
EF Code First程式集和命名空間
EF Code First CTP5更新了程式集名稱,引入了新的命名空間:
- 程式集名稱:EntityFramework.dll
- 命名空間:System.Data.Entity
這些命名將與我們最終發行版的類別庫中所用的保持一致。
CTP5中好的新改進
新CTP5發佈版的EF code First包括一些不錯的改進。突出的有:
- 對現有資料類別庫更好的支援。
- 內建模型層驗證和Data Annotation支援。
- 流暢API 改進。
- 可插入的協定支援。
- 用於變更追蹤 (Change Tracking) 的API。
- 改進的並行衝突處理。
- 對原始的SQL Query/Command的支援。
本文剩下的部分將詳細講述一部分上面所說的更新。
對現有資料類別庫更好的支援
EF Code First能很方便的建立作用在現有資料類別庫的模型層。CTP5包括一些細微的改良,能提高這種開發工作流程的效率。
下面是EF Code First為NorthWind範例資料類別庫建立模型層的步驟:
步驟一:建立模型類別別和DbContext類別
要使用EF Code First建立適用於Northwind資料類別庫的簡單模型層,下面是所有必需程式碼:
EF Code First使你能夠使用 " POCO" ——普通傳統CLR對像(Plain Old CLR Objects)——來表示資料類別庫中的實體。這意味著你不需要從基底類別繼承模型類別,也不需要實現任何介面或資料持久化的屬性。這使得模型類別乾淨,易測,而且「透明持久化」。上面的Product和Category類是POCO模型類別的範例。
透過生成一個公共屬性與資料類別庫中的表相匹配的DbContext類別, EF Code First使你能容易地連接POCO模型類別和資料類別庫。上面的Northwind類展示了如何實現。它將我們的Product和Category類映射到資料類別庫中的「product」和「Categories」表格。Product和Category類別中的屬性反過來映射到Products和Categories表中的列——每一個Product/Category對像實例對像表中相應的一行。
上面就是建立我們的模型和資料訪問層所需的所有程式碼!對現有的資料類別庫,前面幾個版本的EF Code First需要一個別的步驟(呼叫Database.Initializer<northwind>(null)來防止EF Code First建立新的資料類別庫)——這個步驟在CTP5中已經不需要了。
步驟二:配置資料類別庫連接字串
我們已經寫完所有定義模型層所需的程式碼。使用前的最後一步是準備一個連接資料類別庫的連接字串。為了實現這個,我們需要在Web.config文件(或客戶端的App.Config文件)中加一個 Northwind 連接字串,像這樣:
<connectionStrings>
<add connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\northwind.mdf;User Instance=true"
providerName="System.Data.SqlClient" />
</connectionStrings>
依照EF Code First中使用的約定, DbContext類預設會去尋找與上下文類同名的連接字串。因為我們的DbContext類名是「Northwind」,所以它預設會去尋找並使用「Northwind」連接字串。我們上面的Northwind連接字串設定使用一個本地SQL Express資料類別庫(存儲在我們的專案所在目錄的\App_Data下)你也能選擇指向一個遠程SQL 伺服器。
步驟三:使用我們的Northwind模型層
透過EF Code First建立的強型別模型層,我們現在能很容易地查詢和更改我們的資料類別庫。
下面的程式碼Demo如何將LINQ to Query應用到特定產品類別的產品上。這個查詢傳回一列與查詢條件相符合的強型別對像:
下面的範例程式碼Demo如何檢索出一個product對象,修改它的2個屬性,然後將改動保存並傳回至資料庫。
EF Code First幫我們追蹤所有這些更改,處理所有資料持久化工作, 讓我們能專注於我們的應用與商業邏輯,無需擔心資料存取細節。
內建模型驗證
EF Code First允許你使用任何想要的驗證方法來實現模型層中的業務規則,非常靈活而且強大。
自本周的CTP5開始,EF Code First會包含一個對 DataAnnotations 和 IValidatorObject 驗證的內建支援, 和.NET 4一樣。 這讓你能很容易地在你的模型上實現一些驗證規則,一旦模型層被保存,EF Code First將自動驗證它們。它提供一個在你的應用中實現驗證的便捷方法。
對Northwind模型應用DataAnnotations
下面的程式碼Demo如何向我們的Product模型的兩個屬性上添加一些宣告性驗證規則:
我們使用上面的[Required]和[Range]特性(attribute)。 這些驗證特性包含於.Net4的System.ComponentModel.DataAnnotations命名空間中,能獨立於EF使用。它們所規定的一些錯誤信息要不就是被顯式地定義(如上),要不就是來自資源文件(它使實現應用程式本地化變得容易)。
SaveChanges()上的強制驗證
EF Code First(從CTP5開始)現在將在模型對像被修改或者保存的時候自動運用和強制資料註解規範。你無需寫任何程式碼來實現它,這是預設實現的。
這個新支援意味著如下違反我們上述規範的程式碼將在我們呼叫NorthwindDbContext的「SaveChanges()「的時候自動拋出一個異常:
呼叫SaveChanges() 方法的時候拋出的DbEntityValidationException異常包含一個EntityValidataionErrors屬性,你能用它得到模型保存時發生的所有驗證錯誤。這使你能很容易地指導用戶如何去修正它們。注意如果一個驗證規則被違反,EF Code-First將終止整個修改事務以保證我們的資料庫的持續性和有效。
EF Code First的驗證強制工作對內建.NET DataAnnotation特性和任何你透過定義繼承自基底類別(System.ComponentModel.DataAnnotations.ValidationAttribute)的子類生成的自訂驗證規則都有效。
UI 驗證支援
我們很多.NET中的UI框架也支援基於DataAnnotation的驗證規則。 比如說, ASP.NET MVC,ASP.NET動態資料和Silverlight(透過WCF Ria Service),所有這些都透過對模型對象的資料使用DataAnnotation,提供客戶端UI的驗證支援。
下面這個截圖Demo在沒有提供合適的的值的時候,如何利用ASP.NET MVC3中預設的 "Add-View" 模板顯示一個合適的驗證錯誤信息。
ASP.NET MVC3對客戶端和服務端都支援強制執行這些驗證規範。顯示的錯誤信息是自動從聲明的驗證屬性中提取出來的——你無需寫自訂程式碼去顯示它們。
「保持事物DRY」
DRY原則表示「不要重複你自己(Do not Repeat Yourself)「,是」一次定義,處處適用」的最佳實踐方法,防止在你的應用程式中幾個不同的地方都重複同樣的邏輯/配置/程式碼。
EF Code First CTP5現在能使你在你的模型類別中應用聲明性的DataAnnotation驗證,然後在所有的應用程式場景中都實施——包括控制器,視圖,客戶端腳本和任何改動和控制模型類別的自訂程式碼。
有了這些,構建良好的能快速重用與演化的、擁有簡潔程式碼的應用程式將變得更簡單。
CTP5中新增的其他EF Code First改進
EF Code First CTP5中還包含一些其他的改進。下面是其中一部分的簡單描述。
- 流暢(Fluent)API改進
EF Code First允許覆蓋DbContext 類中的OnModelCreating()方法進一步精細化/覆蓋模型類別與相關的資料類別庫結構的映射規則。
CTP5還包括一些針對傳入該方法的ModelBuilder類的改良,它能使映射規則的定義更簡潔明瞭。ADO.NET組發表了一些範例和展示如何實現的文章(這裡)
- 可插入約定支援
EF Code First CTP5 提供覆蓋EF Code First遵從的預設約定的支援,你可以有選擇性地用自己的約定集來代替他們:
- 變更追蹤的新API
EF Code First CTP5公開了一組新的變更追蹤信息,它能讓你存取原始的,當前的,已存的值和狀態(比如 添加,取消改動,更改,刪除)。這個支援在很多場景中都很有用。
- 改進的並發性衝突解決方法
EF Code First CTP5提供了一個更好的,允許訪問相關對像實例的異常消息,以及利用當前的,原始的與資料類別庫值解決衝突的能力。
- 原始SQL 查詢/命令支援
EF Code First CTP5現在允許透過DbContext.Databaset屬性公開的SqlQuery和SqlCommand方法執行原始的SQL查詢和命令(包括預存程序SPROCs)。呼叫這些方法得到的結果能實體化成對像實例,這些實例的改動能被DbContext追蹤。這對各種各樣的高級場景很有用。
- 完整資料註解支援
EF Code First CTP5現在支援.NET中所有的DataAnnotation,並能使用它們進行驗證以及在資料類別庫生成場景中用到EF Code First的時候自動生成合適的資料類別庫模式。
總結
EF Code First提供了優雅又強大的方法來處理資料。它不但非常乾淨,支援最佳實踐方法,而且能非常非常快地實現解決方法,所以我真的很喜歡它。程式碼唯一的方法則意味著整個模型層都很靈活,容易客制。
本周發佈的CTP5進一步改進了EF Code First,並有利於確保明年早期發佈時的滿意度。我推薦現在就用NuGet安裝並試用一下它。我想你會感到驚喜的。
希望對您有所幫助。