摘要:VS 2010 SP1 和 SQL CE
原文發表位置:VS 2010 SP1 and SQL CE
原文發表時間:January 11, 2011
上個月我們發佈了VS 2010 Service Pack 1 (SP1)Beta . 你可以在Jason Zander的兩篇文章和Scott Hanselman包含了VS 2010 SP1 Beta的一些新功能的文章中瞭解更多關於VS 2010 SP1 Beta的訊息。你可以從這裡下載和安裝VS 2010 SP1 Beta。
上周我發表了關於VS2010 SP1中新增的對 IIS Express的支援的文章。今天的文章中我將要討論一些支援SQL CE的VS2010 SP1工具支援,並且逐步講一些它實現的很酷的應用場景。
SQL CE—它是什麼?為什麼要關注它?
SQL CE是一個免費的,可嵌入的資料庫引擎,它使資料庫儲存變得容易。
不需要資料庫安裝
SQL CE使你不必執行可執行程式或者安裝一個資料庫伺服器來使用它。你可以簡單地把SQL CE文件複製到ASP.NET應用程式的\bin目錄中,然後你的web應用程式就能把它當作資料庫引擎來用。執行時不需要安裝或安全許可。在機器上你不必具有管理員帳戶。只要把你的web應用程式複製到任何一個伺服器上,它就能工作。對執行在虛擬主機環境中的中度信任應用程式也是如此。
SQL CE在ASP.NET應用程式的記憶體中執行,當你第一次訪問一個SQL CE資料庫時它會啟動,並且當應用程式被卸載 (unload) 後它會自動關閉。SQL CE資料庫被作為ASP.NET應用程式中的\App_Data下的文件形式儲存。
使用已有的資料API
SQL CE4使用現有的基於.NET的資料API,也支援SQL伺服器相容的查詢語法。這意味著你可以使用現有的資料API像ADO.NET,也可以使用高級別的ORM,例如 Entity Framework 和配有SQL CE的Nhibernate。這使你可以使用你現在所掌握的同樣的資料庫程式設計技術和資料API。
支援開發,測試和生產案例
SQL CE可被用在開發案例,測試案例和輕量級的產品使用案例。在SQL CE4版本中我們已經做了一些工程技術工作來確保在多執行緒伺服器場景(比如 ASP.NET)中,SQL CE不會出現故障或死結。這是針對SQL CE上一個版本的一個大的改動—之前是只為客戶場景設計的,這顯然阻礙了其在web 伺服器環境中的執行。從SQL CE4開始, 你也可以在web伺服器中使用它。
SQL CE沒有許可證限制,它也是完全免費的
很容易移植到SQL伺服器
SQL CE是一個嵌入式資料庫—這使得它對開發,測試,和輕量級的使用場景是很理想化的。對於高容量的網站和應用程式,你也許想把資料庫遷移至使用SQL Server Express(這是免費的),SQL Server或SQL Azure。這些伺服器有更好的可擴充性,更多開發功能(功能如預存程序—SQL CE不支援),也包括更多高級資料管理能力。
我們將發佈遷移工具,這可以使你根據需要使用SQL CE資料庫,並很容易地把它們升級到使用SQL Server Express,SQL Server,或SQL Azure。當把一個SQL CE資料庫升級到SQL Server或SQL Azure時,你不必改變程式碼。我們的目的是使你能夠在web.config文件中僅改變資料庫連接字串就能使你的應用程式維持原有的工作。
VS 2010 SP1 中適用於SQL CE的新工具支援
VS 2010 SP1包含了改善很多的工具支援SQL CE,並且第一次添加了對ASP.NET專案中SQL CE使用的支援。使用VS 2010 SP1,你現在可以:
· 建立新的SQL CE資料庫。
· 編輯和修改SQL CE資料庫架構和索引。
· 用資料填充SQL CE資料庫。
· 用 Entity Framework Designer 建立與SQL CE資料庫匹配的模型層。
· 使用 EF Code First 定義程式碼裡的模型層,然後從它們裡建立一個SQL CE資料庫,根據需要用VS編輯資料庫。
· 用web部署(Web Deploy)將SQL CE資料庫部署到遠端伺服器,根據需要將它們轉換到完整的SQL伺服器資料庫。
你可以在ASP.NET Web Form 和基於ASP.NET MVC 的專案中使用上面所有的功能。
下載
透過安裝 VS 2010 SP1 (beta)你可以獲得VS2010中SQL CE工具支援。
裝了SP1 之後,你也需要安裝針對 Visual Studio 的SQL CE 工具下載。這是一個獨立的下載,它使SQL CE工具支援VS2010SP1 。
Demo 兩個場景
在本篇部落格中我將透過一個ASP.NET 表單和一個基於ASP.NET MVC的應用程式來Demo SQL CE 和VS 2010 SP1的使用 。具體來說,我們將逐步講解:
· 怎樣使用VS 2010 SP1 建立SQL CE 資料庫,然後使用Visual Studio的EF4 視覺化編輯器來建立一個模型層,然後用ASP.NET GridView控制項來顯示和編輯資料。
- 怎樣用 EF Code First 定義一個使用POCO類別的模型層,然後使EF Code First 程式基於模型類別「自動地建立」一個SQL CE 資料庫。我們就看看怎樣使用VS 2010 SP1對SQL CE的新支援來查閱已建立的資料庫,用資料填充它,在以後改變它的架構。我們會在基於 ASP.NET MVC 的應用程式背景下做這些 .。
透過安裝 VS 2010 SP1 (beta),然後安裝 適用於Visual Studio下載的SQL CE 工具 (這是一個獨立的下載,它能使SQL CE工具支援VS 2010 SP1)你可以在你的機器上做下面的兩個步驟 。
步驟1:建立一個SQL CE資料庫,建立EF模型類別,用GridView修改資料
第一個步驟將會Demo在一個ASP.NET Web Form 應用程式中怎樣建立和定義一個SQL CE資料庫。然後我們會為它建立一個EF模型層以透過一個<asp:GridView>控制項來修改資料。
第一步:建立一個新的ASP.NET Web Form程式
在Visual Studio中從文件->新項目選單命令開始,建立一個新的ASP.NET Web Form專案。我們將用「ASP.NET Web Application」專案模板選項,以使它應用有預設的UI介面:
第二步:建立一個SQL CE資料庫
在建立的專案中以右鍵點按「App_Data」資料夾,選擇「新增->新的項目」選單命令:
這將會顯示「新增項目」對話盒。選擇「SQL Server Compact 4.0 Local Database」項目(在VS 2010 SP1中新增的)並將資料庫文件命名,建立「Store.sdf」:
注意SQL CE資料庫文件有一個.sdf檔案副檔名。把他們放到ASP.NET 應用程式的/App_Data資料夾裡,使它更容易部署。
當點擊上面的「新增」按鈕時,一個Store.sdf文件就會被添加到我們的程式中:
第三步: 添加一個「Products」 表格
在Server Explorer 選項卡中於「Store.sdf」資料庫檔案上按兩下,將會打開它。由於它是一個新的資料庫,所以裡面沒有表格:
在「Tables」圖示上按右鍵,選擇「Create Table」 選單命令以建立一個新的資料表。我們將為它命名為「Products」 並為它添加4列。我們將把第一列標記為主鍵(並把它作為一個自動編號列以使它的值會隨著每個新的行自動增加) :
當按了「ok」後我們的產品表格會在SQL CE資料庫中被建立。
第四步:用資料填充
一旦產品表格建立了,它就會在Server Explorer中顯示出來。我們可以以右鍵點按它,選擇「Show Table Data」選單命令,修改它裡面的資料:
讓我們對它來添加一些資料樣本:
步驟5:建立一個 EF模型層
我們有一個裡面含有資料的SQL CE資料庫—現在就讓我們來建立一個EF模型層來為我們提供一個簡單的方法來查詢並更新它裡面的資料。
在專案上以右鍵點按,選擇「新增->新的項目」選單命令。將會彈出一個「新增項目」對話盒—選擇裡面的「ADO.NET Entity Data Model」選項,並將其命名為「Store.edmx」。
這就會在我們的解決方案資源管理器中添加一個新的Store.edmx項並啟動一個允許我們快速地建立一個EF 模型的精靈 (即 Entity Data Model Wizard):
選擇上面的「Generate From Database」選項並點按下一步。選擇剛才建立的Store.sdf SQL CE資料庫,然後再次點按下一步。
精靈會問你想要產生模型的是什麼資料庫對象。我們就選擇產生之前建立的「Products」 表格:
當按「Finish」按鈕,Visual Studio將會打開EF Designer。它上面會出現一個已有的對應到我們的SQLCE資料庫中」Product」表的產品實體:
VS 2010 SP1 EF Designer 和SQL CE配合工作得相當好,就像它和SQL Server 和 SQL Express工作一樣。上面的產品實體會被當作一個類別(稱為「Product」),我們能在ASP.NET應用程式中程式設計處理它。
第六步:編譯專案
在使用模型層之前你需要建立一個專案。使用Ctrl+Shift+B鍵來編譯程式,或者用Build->Build Solution選單命令來完成。
第七步:用EF模型層建立一個頁面
現在讓我們來建立一個包含GridView控制項的簡單的ASP.NET Web Form,我們可以用它來顯示和編輯我們的產品資料(透過我們剛建立的EF模型層)。
以右鍵點按專案,選擇 [新增->新的項目]命令。選擇「Web Form from Master Page」選項模板,並把你建立的頁面命名為「Products.aspx」。把主頁建立在項目的根部的「Site.Master」模板上。
添加一個頂端有<h2>Products</h2>的新頁面,同時在它裡面添加一個<asp:gridview>控制項:
然後點擊「Design」 選項,轉到設計檢視。選擇GridView空間,然後點擊右上角來顯示GridView的「智慧標籤」UI:
選擇上面圈出部分的「New data source…」下拉選項。這會產生下面的讓你選擇你的資料來源類型的對話盒:
選擇「Entity」資料來源選項–它會使我們很容易地從我們的GridView連接到我們早先建立的EF模型層。這會產生另一個對話盒:
在下拉選項中選擇「StoreEntities」–這是我們之前建立的EF模型層。然後點按下一步–這會讓我們選擇我們想要繫結到的實體:
在上面的對話盒中選擇「Products」實體–這表明我們我們想要繫結到我們之前定義的「Product」實體類別。然後點擊「Enable automatic updates」核取方塊以確保我們可以查詢和更新Products。當點按「Finish」,VS會顯示一個<asp:EntityDataSource>到<asp:GridView>控制項:
我們將要做的最後兩步是在表格中點按「Enable Editing」核取方塊(這將會使 GridView 在每行顯示出「Edit」連接),並且(有選擇性地)使用Auto Format 對話盒來為 GridView 選擇一個UI模板。
第八步:執行程式
現在就讓我們來執行下我們的程式,並瀏覽包含有GridView的/Products.aspx頁面。這樣做了之後,我們將會在SQL CE資料庫中看到Products的一個表格 UI。點按每行的「Edit」連結會使我們看到它們的值:
當點按了「Update」之後,GridView就會傳回它們的值,透過EF模型層使它們存留著,最終在SQL CE資料庫中保存。
瞭解更多關於ASP.NET Web Forms中的EF使用
請在http://asp.net網站上閱讀這個課程系列瞭解更多關於怎樣用ASP.NET Web Forms使用EF 。
教程中將SQL Express用作資料庫–但欣慰的事情是所有相同的步驟/概念現在都可以用SQL CE完成。
Demo2: 透過SQL CE和ASP.NET MVC 3使用EF程式碼優先
上面的案例我們使用了資料庫優先 (Database First) 的方法–此處我們先建立了資料庫,然後用EF設計器從資料庫中建立模型類別。
除了支援基於設計器開發的資料流,EF也支援更多以程式碼為中心的選擇,我們稱之為 「程式碼優先開發 (Code First)」。程式碼優先開發形成了一個相當令人喜愛的開發工作流程。它使你可以:
· 透過需簡單地編寫「普通舊類別」(註:即 POCO 類別) 來定義你的模型對象,而不需要基底類別或視覺化的設計器。
· 使用「習慣優於組態」方法,從而不用明確地設定任何東西就能使資料庫保持一致性。
· 根據需要覆蓋基於約定的儲存,使用一個流暢的程式碼API來完全地客制儲存對映。
· 基於你定義的模型類別根據需要自動建立資料庫–允許你先從程式碼開始
過去我已經發表了幾篇關於EF程式碼優先的文章–我真的覺得它很棒。好消息是它也可以和SQL CE一起很好地使用。
SQL CE, EF 程式碼優先和支援SQL CE的新VS 工具支援的組合形成了一個相當不錯的工作流程。下面是一個簡單的例子,告訴你怎樣使用它們建立一個簡單的ASP.NET MVC 3專案。
第一步:建立一個新的ASP.NET MVC 3專案
我們將從Visual Studio中的文件->新項目選單命令開始建立一個新的ASP.NET MVC 3專案。我們將使用「Internet Project」模板以使它有一個預設的介面實作:
第二步:用NuGet安裝EFCodeFirst
接下來我們要用NuGet套件管理器(ASP.NET MVC 3自動安裝的)來把EFCodeFirst程式庫添加到專案中。我們將用套件管理器命令窗口來做這個。在Visual Studio中透過選擇查看->其他視窗->套件管理控制台 選單命令打開套件管理器控制台。然後在套件管理器控制台中輸入:
install-package EFCodeFirst
來下載EFCodeFirst程式庫,把它添加到專案:
當我們輸入了上面的命令,EFCodeFirst程式庫就會被下載下來並添加到我們的應用程式中:
第三步:建立一些模型類別
使用一個基於「程式碼優先」的開發工作流,我們會先建立模型類別(甚至在我們建立資料庫之前)。我們用寫程式碼的方法來建立這些模型類別。
對於這個案例,我們將在工程的「Models」資料夾上以右鍵點按,向我們的工程添加下面的3個類別:
上面的「Dinner」 和 「RSVP」模型類別是「普通舊 CLR 對像」 (又稱為 POCO)。它們不需要由任何基底類別導出或實作任何介面,並且它們的屬性都是標準的.NET資料型別。 它們上面沒有添加資料保存屬性或資料程式碼。
「NerdDinners」類別繼承自DbContext(由EFCodeFirst提供),它處理從資料庫中恢復/保存Dinner 和RSVP執行個體。
第四步:Dinner列表
我們已經為這個專案寫了對完成模型層所需要的所有程式碼。
現在讓我們公開執行專案中的URL: /Dinners/Upcoming。我們將用它來羅列未來將要發生的Dinner。
我們將透過在「Controllers」資料夾上以右鍵點按,選擇「新增->控制項」選單命令來實現它。我們將指出我們想要的控制器來建立「DinnersController」。然後我們會在它裡面實現一個「即將實現的」行為方法,它使用上面的模型層列出了即將到來的Dinner。我們將用一個LINQ查詢來恢復資料,把它傳遞給一個 View,程式碼如下:
然後在方法上以右鍵點按,選擇「新增-檢視」選單命令來建立一個展示了Dinner的「將要實現的」檢視模型。
我們將在「新增檢視」對話框中使用「empty」模型選項,並用Razor寫出下面的檢視模板:
第四步:偵錯我們的專案以使用SQL CE資料庫
我們已經完成了所有程式碼的編寫–下一步將會是編譯一個將要使用的資料庫連接字串。
透過把下面的<connectionString>添加到專案的頂部的web.config文件,我們將向SQL CE指出我們的NerdDinners模型類別:
EF程式碼優先使用一個預設的約定,在這協議裡內容類別 (Context class) 會尋找一個與DbContext類別名字匹配的連接字串。由於之前我們建立了一個「NerdDinners」類別,我們也把連接字串命名為「NerdDinners」。 上面我們偵錯連接字串以將SQL CE 用作資料庫,並且告知它我們的資料庫文件將會存在於ASP.NET工程的\App_Data目錄中。
第五步:執行程式
既然我們已經建立了應用程式,那就來執行它吧!
我們將瀏覽/Dinners/Upcoming URL–這樣做會顯示一個空的列單:
你也許會問—列表從哪裡查詢來的?我們並沒有明確地建立一個資料庫?!?
EF程式碼優先支援的很酷的功能之一是在我們指出的資料庫並不存在時自動地建立資料庫的能力(取決於模型類別的框架)。上面我們偵錯了EF程式碼最佳化使之在專案的\App_Data\目錄下指向一個SQL CE資料庫。當我們執行程式時,EF程式碼優先發現SQL CE資料庫並不存在並自動地為我們建立一個。
第六步:使用VS2010 SP1來探究新建立的SQL CE資料庫
在解決方案資源管理器中點擊「顯示所有文件」,你會看到「NerdDinners.sdf」 SQL CE資料庫文件,它是由\App_Data\資料夾裡的EF程式碼優先為我們自動建立的:
我們可以選擇在文件上以右鍵點按,選 "Include in Project" 把它添加到我們的解決方案中:
我們也可以在檔案上按兩下(不管它是否添加到了專案),VS 2010 SP1會把它作為一個我們可以在IDE的「服務資源管理器」內編輯的資料庫來打開。當我們透過執行上面的應用程式進入了NerdDinners 類別,它就會被EF程式碼優先執行:
我們可以在表格上以右鍵點按,使用「Show Table Data」命令來往資料庫中輸入一些即將發生的Dinner:
我們將使用VS 2010 SP1支援的內建編輯器來填充下面的表格資料:
現在當我們在瀏覽器裡的/Dinners/Upcoming URL上點擊「refresh」 ,我們就會看到一些將要有的Dinner顯示出來:
第七步:更改我們的模型和資料庫架構
現在讓我們來修改模型層和資料庫的架構,並Demo一種使得這種做法更簡單的新的針對SQLCE的VS 2010 SP1工具支援方法。
使用EF程式碼優先你可以從修改一個模型類別來開始改變資料庫。例如,我們添加一個附加的字串屬性「UrlLink」到我們的「Dinner」類別。我們可以使用這個指向更多關於時間的連結:
現在當我們再次執行程式,並訪問/Dinners/Upcoming URL我們將會看到拋出一個例外:
我們能看到這個錯誤是因為EF程式碼優先自動地建立資料庫,且在預設情況下建立資料庫後會添加一個表格,它幫忙追蹤資料庫架構是否和我們的模型類別同步。當它們不同步時,EF程式碼優先會拋出一個錯誤—這使得在開發時期發現問題變得更容易,然而也許你只在執行時才會發現(透過含糊的錯誤)。注意如果你不想要這個功能,你可以透過改變DbContext類別(在NerdDinners類別中)預設的約定使它不再追蹤schema version的方式,把它關掉。
在上面的例子中我們的模型類別和資料庫架構是不同步的—我們怎麼才能修復呢?現在你可以使用兩種方法:
· 刪掉資料庫,使EF程式碼優先在一個新的模型類別框架(在現有的DB中遺失了資料)的基礎上自動地重建資料庫
· 修改已有的資料庫使它和模型類別保持同步(保持/移植DB中現有的資料)
有兩種方法可以用來做上面的第二種方法。下面我將Demo怎樣利用新的針對SQL CE的VS 2010 SP1工具支援來使用資料庫架構工具修改我們的資料庫結構。將來我們也打算用EF支援「遷移」功能,它將會允許你在程式上自動地/手寫資料庫架構遷移。
第八步:使用VS 2010 SP1修改我們的SQL CE資料庫架構
VS 2010 SP1中的新的SQL CE工具支援使得修改我們已有的SQL CE資料庫架構變得更容易。要做到這些,我們可以透過以右鍵點按「Dinners」表格,選擇「編輯表格架構」命令:
這將會產生下面的「編輯表格」對話框。我們可以重新命名,修改或刪除表格中任意一個已有的列,或在列的列標底部點按,手動添加一個新列。下面我已經添加了一個「nvarchar」型別(由於我們的屬性是一個字串)的「UrlLink」新資料欄:
當點擊了「ok」之後,資料庫會自動更新產生一個新的欄位,現在我們的架構就和模型類別相匹配了。
由於我們是手動地修改資料庫架構的,所以我們要有一個附加的步驟來讓EF程式碼優先知道資料庫架構和模型類別是同步的。正如我很早之前提過的,當EF程式碼優先自動地建立一個資料庫時,同時也添加了一個「EdmMetadata」表格到資料庫來追蹤架構版本(把模型類別弄亂來阻止它們發現模型類別和資料庫架構的不匹配):
由於我們是手動地更新和維護我們的資料庫架構,我們不需要這個表格—所以可以刪掉它:
這樣我們僅剩下了下兩個和模型類別對應的表格:
現在當我們再次執行/Dinners/Upcoming URL,它將會正確地展示Dinner列表:
我們最後要做的一個修改將是更新 View 來檢查新的UrlLink屬性,如果一個事件有UrlLink屬性的話為它提供一個<a>連結:
現在當我們更新/Dinners/Upcoming時,我們將會看到資料庫中儲存UrlLink的事件有超連結:
總結:
SQL CE提供了一個免費的,嵌入式的資料庫引擎,易於你使用資料庫儲存。有了SQL CE4,你可以在ASP.NET專案和應用程式(Web Forms 和 MVC)中使用它。
VS 2010 SP1提供的工具支援使你可以簡單地建立,編輯和修改SQL CE資料庫—也可以使用標準的EF設計器。這使你在利用嵌入式的資料庫選項的同時重溫你已掌握的技術和資料知識。這對小的應用程式(你不需要完全的SQL Server的可擴充性)和開發測試案例—你想不用全局的資料庫案例快速地開發/測試你的應用程式有很大的幫助。
SQL CE使得後期遷移你的資料到一個完整的SQL Server或SQLAzure執行個體變得容易——如果你想的話——不用改變應用程式中的任何程式碼。在上面的兩個場景中我們需要改變的只是web.config文件中的<connectionString>值,以使程式碼在SQL Server上執行。這為從小的嵌入式資料庫解決方案基礎上擴展的應用程式提供了很大的靈活性。
希望這些對您有所幫助。
Scott
附:除了發表部落格,我現在也使用Twitter來快速更新並分享連結。請關注我:twitter.com/scottgu