原文名稱:EF Code First and Data Scaffolding with the ASP.NET MVC 3 Tools Update 我們剛剛發(fā)布了 ASP.NET MVC3 的工具更新,,安裝地址:http:///mvc 在今天的博客中,,我將詳細介紹這次更新帶來的兩個酷的特性:
這兩個特征對 Web 應(yīng)用程序提供了強大的支持。 我們將要創(chuàng)建的目標為了幫助說明如何使用這兩個特性,,我們將創(chuàng)建一個簡單的數(shù)據(jù)驅(qū)動站點,,這個站點可以列出我們的產(chǎn)品。 下面是創(chuàng)建或者編輯新產(chǎn)品的時候,,分類信息也同樣,。 我們現(xiàn)在就創(chuàng)建整個應(yīng)用,包括后臺的數(shù)據(jù)庫,,使用 ASP.NET MVC3 只需要一到兩分鐘就可以,。 Step 1: 創(chuàng)建新項目我們通過創(chuàng)建一個新的 ASP.NET MVC3 項目開始,點擊 文件 -> 新建項目,,我們使用 Internet 項目模板,,這將為我們的應(yīng)用提供一個默認的起始模板。 當你在解決方案管理器中觀察新創(chuàng)建的項目時,,你將會看到 ASP.NET MVC3 更新后的工具增為我們的 ASP.NET MVC3 項目增加了一個新的程序集 EntityFramework ,。 EntityFramework 程序集實現(xiàn)了 Entity Framework4.1 ,EF4.1 為 .NET 的數(shù)據(jù)訪問提供了巨大的改進,,包括 Code First,。EF Code First 提供了完全優(yōu)雅和干凈的數(shù)據(jù)處理方式 ,使你不再需要設(shè)計器或者 XML 的映射文件,。通過 ASP.NET MVC3 項目就可以簡單的使用這個優(yōu)點,。 我們將使用 EF Code First 來實現(xiàn)項目的數(shù)據(jù)訪問。 Step 2: 實現(xiàn)數(shù)據(jù)模型類第一步,,我們將創(chuàng)建兩個類,Product 和 Category,,我們應(yīng)用程序的數(shù)據(jù)模型,,我們在 Models 文件中中創(chuàng)建標準的 POCO “簡單的老的 C# 對象” ,。代碼如下: 注意到上面的類是標準的 .NET 數(shù)據(jù)類型,不需要派生自任何基類,,也不需要實現(xiàn)任何接口,。 對于每個單獨的屬性,每個類有一個關(guān)聯(lián)屬性,,例如,,Product 類有一個名為 Category 的屬性使開發(fā)人員可以獲取產(chǎn)品所屬的 Category ,而 Category 類中有一個名為 Products 的屬性,,使得開發(fā)人員可以獲取分類的所有產(chǎn)品,,EF Code First 可以自動管理這些關(guān)聯(lián)(使用主外鍵關(guān)系),還可以在后臺延遲加載數(shù)據(jù)。 Step 3: 使用 EF Code First 實現(xiàn) StoreContext 類現(xiàn)在,,我們已經(jīng)定義了兩個模型類,,下一步我們將要實現(xiàn) DbContext 類,使用 EF Code First 需要使用這個類將模型對象映射到數(shù)據(jù)庫中表,,我們的實現(xiàn)如下所示: 我們使用 StoreContext 類映射我們的 Product 和 Category 與數(shù)據(jù)庫的關(guān)系,,它派生自 EF Code First 中的 DbContext,提供了兩個屬性關(guān)聯(lián)到數(shù)據(jù)庫中的表,,對于我們的例子來說,,使用默認的“約定勝于配置”方式,這意味著 Products 屬性映射到數(shù)據(jù)庫中的 Products 表,,Categories 映射到數(shù)據(jù)庫中的 Categories 表,。在博文的后面,我還將討論如何實現(xiàn)自定義的映射,。 你可以將這個類加入到解決方案的任何位置,,例如,可以放置在 \Models 文件夾中,,或者放在一個獨立的類庫項目中,,可能你需要在代碼的前面增加對于命名空間 System.Data.Entity 的引用。DbContext 和 DbSet 定義在其中,。 Step 4: 搭建 Categories 控制器的腳手架我們已經(jīng)創(chuàng)建了從數(shù)據(jù)庫獲取或者保存數(shù)據(jù)的所有內(nèi)容?,F(xiàn)在,我們創(chuàng)建一個 ASP.NET MVC 的控制器來實現(xiàn)對于分類數(shù)據(jù)的創(chuàng)建/編輯/刪除/更新,,從前的時候,,你不得不手動寫一個控制器來完成這些功能,包括你自己實現(xiàn)通過 EF Code First 訪問數(shù)據(jù)代碼,,現(xiàn)在,,ASP.NET MVC3 工具更新現(xiàn)在包括內(nèi)建的腳手架支持幫助你自動完成這些工作。 搭建一個新的 Categories 控制器類,我們在 /Controllers 文件夾上右鍵,,然后選擇 增加 Add -> 控制器 Controller 上下文菜單,。 然后,彈出增加控制器 Add Controller 的對話框,,我們對創(chuàng)建的控制器命名為 CategoriesController,,現(xiàn)在的對話框支持一個新的 腳手架節(jié),允許我們使用內(nèi)建的模板來搭建控制器,。 我們選擇 Controller With read/Write action and views, using Entity Framework 模板,,這將使創(chuàng)建的控制器包括完整的 EF 增、刪,、改,、查 代碼。 在選擇這個模板之后,,我們選擇控制器使用的模型類,,來實現(xiàn) CRUD 支持,這里是 Dategory 類,,我們也選擇 EF DbContext/ObjectContext 類來訪問數(shù)據(jù)庫,,在這里,使用我們前面定義的 StoreContext 類,。 當我們點擊 Add 按鈕的時候,,Visual Studio 將會自動創(chuàng)建一個 CategoriesController 類,包括實現(xiàn)了Create,、Edit,、Details、Delete 和 Index Action 方法, 還有每一個 Action 相關(guān)的視圖模板,。 如果打開 CategoriesController.cs ,,將會發(fā)現(xiàn) Action 方法中已經(jīng)實現(xiàn)了通過 EF 的數(shù)據(jù)訪問支持。 我們已經(jīng)實現(xiàn)了訪問 Categories 數(shù)據(jù)的所有代碼,。 Step 5: 配置數(shù)據(jù)庫的位置在運行之前,,我們的最后一步我們使用的數(shù)據(jù)庫位置。EF Code First 允許使用現(xiàn)有的數(shù)據(jù)庫,,也允許使用目前還不存在的數(shù)據(jù)庫,,可以通過模型類來自動創(chuàng)建它。 沒有連接串的情況默認情況下,,你甚至不需要配置連接串來指明數(shù)據(jù)庫,。如果沒有指明,EF Code First 將在 SQL Express 中創(chuàng)建一個與你的 DbContext 同名的數(shù)據(jù)庫,,例如,,我們現(xiàn)在將會在本地的 .\SQLExpress 中創(chuàng)建一個名為 ScaffoldingDemo.Models.StoreContes 的數(shù)據(jù)庫,。 通過連接串顯式制定你還可以在 web.config 中增加一個連接串的配置來顯式指定,連接串的名字需要匹配 DbContext 類的名字,,例如,,在我們的應(yīng)用中,DbContext 的名字是 StoreContext,,默認情況下,EF 將會查找同名的連接串來決定數(shù)據(jù)庫的位置,。 下面是我們使用保存在 App_Data 文件夾中名為 Store.sdf 的嵌入的 SQL CE 數(shù)據(jù)庫配置,。
Step 6: 運行應(yīng)用好啦!現(xiàn)在我們運行這個應(yīng)用,,導航到 /Categories ,,這將會執(zhí)行 CategoriesController 的 Index 方法,列出數(shù)據(jù)庫中所有的分類,,當前還沒有分類,。 點擊 Create New 鏈接來創(chuàng)建一個新的分類,這會導航到 /Categories/Create ,,這個 Action 提供了一個創(chuàng)建新分類的表單,。 點擊 Create 將會 Post 到 CategoriesController ,添加新的分類到數(shù)據(jù)庫中,重復這個操作,,我們可以創(chuàng)建多個不同的分類,。 非常酷的一點在于,,我們不需要寫任何的控制器或者視圖就可以完成,! 腳手架自動生成了需要的代碼,這提供了一個簡單的起點,,我們可以繼續(xù)調(diào)整它來定制更多的功能,。 Step 7: 關(guān)注數(shù)據(jù)庫我們現(xiàn)在配置程序使用嵌入式的數(shù)據(jù)庫 SQL CE,當運行程序的時候,,如果數(shù)據(jù)庫還不存在,,那么 EF 4.1 將會檢測到這一點,然后自動創(chuàng)建它,,基于我們前面定義的 Product 和 Category 類,。 要想在解決方案中看到數(shù)據(jù)庫,在解決方案管理器的上面點擊刷新按鈕,,然后,,EF 自動創(chuàng)建的 Store.sdf 將會出現(xiàn)在 App_Data 文件夾下。 你可以通過雙擊這個數(shù)據(jù)庫,,在服務(wù)器資源管理器中打開它,,然后展開 Tables ,,就可以看到剛剛創(chuàng)建的表。 注意 EF 創(chuàng)建的表基于 Product 和 Category 類,,還根據(jù)類中屬性的定義,,自動創(chuàng)建了主鍵和兩表之間的關(guān)聯(lián)。 Step 8: 搭建 Product 控制器的腳手架我們已經(jīng)創(chuàng)建了 CategoriesController 來管理分類,,下面我們創(chuàng)建 ProductsController 來管理產(chǎn)品,。 就向前面一樣,我們在 \Controller 文件夾上右鍵,,選擇 Add -> Controller 來創(chuàng)建 ProductsController,,我們使用 EF 模板和 Product 模型類。 點擊 Add 按鈕之后,,ProductsController 已經(jīng)搭建完成,,包括 CRUD 方法和相應(yīng)的視圖。 我們可以運行一下,,導航到 /Products,。 點擊 Create New 來創(chuàng)建產(chǎn)品 很酷的是分類是一個下拉列表,而不是一個填寫外鍵的文本框,。 在 Visual Studio 中支持的腳手架很聰明地檢測到關(guān)聯(lián)的分類,,EF 代碼自動關(guān)聯(lián)正確的分類。 在創(chuàng)建一些產(chǎn)品之后,,訪問 /Products 顯示的效果如下,。 注意分類信息是使用友好的名稱顯示出來,而不是一個外鍵值,。 |
|