在本節中,您將使用Entity Framework代碼先行遷移功能對模型類進行修改,並使修改應用到資料庫中。
預設情況下,當您使用Entity Framework代碼先行自動建立一個資料庫,像你在本教程前面做的那樣,代碼首先添加一張表到資料庫中,以協助追蹤資料庫架構是否是同步的模型類是產生的。如果它們不同步,Entity Framework拋出一個錯誤。這使得它更容易在早期開發時跟蹤發現問題,否則,你可能在運行時發現隱晦錯誤。
為模型修改建立代碼先行遷移
如果您使用的是Visual Studio 2012,在“方案總管”中雙擊Movies.mdf的檔案,開啟資料庫工具。Visual Studio Express for Web將顯示“資料庫總管,Visual Studio2012將顯示”伺服器總管“。如果您使用的是Visual Studio 2010中,使用SQL Server物件總管。
在資料庫工具中,在MovieDbContext上右鍵點擊並選擇刪除。
回到方案總管。在 Movies.mdf file檔案上按右鍵並選擇刪除。
譯者註:此處看上去很費解,事實上,第一步實際執行的操作是刪除資料庫連結,彈出的刪除確認提示也說明了這一點,第二步則是在解決方案管理器裡真正刪除資料庫檔案。
產生應用程式,確認沒有編譯錯誤。
在vs2012工具菜單裡,點擊“庫封裝管理員”-》封裝管理員控制台
在控制台的PM>標記後,輸入“Enable-Migrations -ContextTypeName MvcMovie.Models.MovieDbContext”
輸出如下資訊:
PM> Enable-Migrations -ContextTypeName MvcMovie.Models.MovieDbContext
正在檢查內容相關的目標是否為現有資料庫...
已為項目 MvcMovie 啟用 Code First 移轉。
PM>
上面的Enable-Migrations命令建立了一個新的Migrations檔案夾,並在該目錄下建立了Configuration.cs檔案。
使用Visual Studio開啟Configuration.cs檔案。使用以下代碼替換Seed方法內容:
protected override void Seed(MvcMovie.Models.MovieDbContext context) { context.Movies.AddOrUpdate( m => m.Name, new Movie { Name = "少年派的奇幻漂流之旅",Date=DateTime.Now }, new Movie { Name = "一九四二", Date = DateTime.Now }, new Movie { Name = "王的盛宴", Date = DateTime.Now } ); }
以上代碼需要類中匯入名稱空間using MvcMovie.Models;
代碼先行遷移機制在每次遷移後調用Seed方法,如果存在行資料,則該方法更新現有資料,如果不存在,則該方法插入資料。
按下CTRL+SHIFT+B來產生項目(如果此處不執行此產生操作,後續的步驟會失敗)
下一步是建立DbMigration 類來初始化遷移。遷移將建立一個新的資料庫,這也是在前面步驟中刪除資料庫檔案的原因。
在封裝管理員控制台視窗,輸入命令"add-migration Initial"來建立初始遷移。其中Initial可以是任意名稱,用來標識建立的初始檔案。控制台輸出如下:
PM> add-migration Initial
正在為遷移“Initial”搭建基架。
此遷移檔案的設計器程式碼封裝含當前 Code First 模型的快照。在下一次搭建遷移基架時,將使用此快照計算對模型的更改。如果對要包含在此遷移中的模型進行其他更改,則您可通過再次運行“Add-Migration 201212060747227_Initial”重新搭建基架。
PM>
代碼先行遷移機制在Migrations檔案夾下建立另外一個類檔案,檔案名稱為時間戳記+底線+ Initial.cs,例如201212060747227_Initial.cs,該類包含了建立資料庫結構描述的代碼。遷移檔案名稱預置為時間戳記有助於排序。查看該檔案,包含了建立Movie庫表的說明。當你更新資料庫時,該類將被執行,建立資料庫結構描述。隨後,Seed方法將被執行,測試資料被添加其中。
在封裝管理員控制台視窗,鍵入"update-database"命令來建立資料庫和執行Seed方法。
PM> update-database
指定“-Verbose”標記以查看應用於目標資料庫的 SQL 陳述式。
正在應用基於代碼的遷移: [201212060747227_Initial]。
正在應用基於代碼的遷移: 201212060747227_Initial。
正在運行 Seed 方法。
PM>
如果遇到表已存在的錯誤而不能建立,很可能是你刪除資料庫後,執行update-database前運行了應用程式(重新編譯器,自動建立了資料庫)。這種情況下,再次刪除資料庫檔案,並執行 update-database命令。如果仍然出錯,刪除migrations目錄和內容,重新開始本教程操作。
運行應用程式,導航到 /Movies 地址。種子資料顯示出來了。
譯者註:此處的種子資料,實際上指的是一些庫表建立後添加的一些測試資料或者系統初始化資料,如系統參數,部門的根目錄等。
為Movie模型增加評價屬性
為已存在的影片類增加評價屬性。開啟 Models\Movie.cs檔案,增加Rating屬性如下
public string Rating { get; set; }
通過產生菜單或者CTRL+SHIFT+B快速鍵編譯應用程式。
現在你已經更新了模型類,同樣需要更新 \Views\Movies\Index.cshtml 和\Views\Movies\Create.cshtml 視圖模板。
開啟\Views\Movies\Index.cshtml 檔案,在Price列後增加欄位標題<th>Rating</th>。然後在模板結尾附近增加<td> 欄標籤。
Create視圖中也做相應修改,此處不再詳細描述。
現在你已經更新了程式碼來支援新增的評價屬性。運行程式並導航到 /Movies ,你會發現以下錯誤:
支援“MovieDbContext”內容相關的模型已在資料庫建立後發生更改。請考慮使用 Code First 移轉更新資料庫(http://go.microsoft.com/fwlink/?LinkId=238269)。
發生該錯誤的原因是你在程式中更新了Movie模型類,與已存在的資料庫中的Movie庫表結構不同(資料庫Movie表中沒有Rating列)。
解決此問題,有以下幾種方法:
1. 令 Entity Framework依據新模型類架構自動刪除和重新常見資料庫。該方法非常適用於開發在測試資料上進行動態開發;可以使你快速演化模型和資料庫表結構。不過,其缺點是,會丟失當前資料庫中已存在的資料—因此你不想在生產資料庫上使用這種方法。在測試資料庫上採用初始化器來自動產生資料庫通常是一種高效開發應用程式的方式。想查看更多關於Entity Framework初始化器方面的資訊,請參閱Tom Dykstra寫的 ASP.NET MVC/Entity Framework tutorial.
2. 顯式地修改現有的資料庫結構描述,以便它匹配模型類。這種方法的優點是保留了現存資料。你可以通過手動或者建立一個資料庫指令碼來做變更。
3. 使用代碼先行遷移來更新資料庫結構描述
在這個課程中,我們將使用上面所說的第三種方式,即代碼先行遷移
更新Seed方法,使其為新增的列提供值。開啟Migrations\Configuration.cs檔案,為每個Movie對象增加Rating值。
產生解決方案,然後開啟庫管理器控制台視窗,輸入以下命令add-migration AddRatingMig
add-migration 命令告訴遷移架構對比當前模型和庫表結果差異,產生必要的代碼來使庫表跟模型適配。AddRatingMig名字可以是任意的,只是遷移檔案的標識符。採用有意義的名字有助於遷移操作。
當命令執行完畢後,Visual Studio開啟類檔案,建立了新的DbMIgration 類,在其Up方法裡,你可以看到建立新列的代碼。
public partial class AddRatingMig : DbMigration { public override void Up() { AddColumn("dbo.Movies", "Rating", c => c.String()); } public override void Down() { DropColumn("dbo.Movies", "Rating"); } }
產生解決方案,庫管理器控制台視窗輸入"update-database"命令。
PM> update-database
指定“-Verbose”標記以查看應用於目標資料庫的 SQL 陳述式。
正在應用基於代碼的遷移: [201212060835020_AddRatingMig]。
正在應用基於代碼的遷移: 201212060835020_AddRatingMig。
正在運行 Seed 方法。
PM>
運行應用程式,導航到/Movies,你將看到新增的Rating列
同樣,你需要修改Edit和Delete視圖,增加Rating屬性。
你可以再次在庫管理器控制台裡輸入"update-database”命令,發現沒有修改被應用,因為當前資料庫表結構跟模型匹配。
在本節中,你學習了如何修改模型對象,並保持與資料庫同步。同時學習了如何建立帶有樣本資料的資料庫的方法。下面我們將學習如何為模型類添加驗證邏輯使商務規則生效。
譯者註:本文說的比較零散,在此做下總結,要使用代碼先行提供的遷移功能來保證模型和資料庫自動匹配,需要在庫封裝管理員裡依次執行以下命令:
1.啟用遷移功能:Enable-Migrations -ContextTypeName MvcMovie.Models.MovieDbContext
2.建立初態:add-migration Initial
3.自動比對差異產生遷移類:add-migration AddRatingMig
4.將遷移應用到資料庫:update-database
在實際的項目開發過程或者維護過程中,因為業務需求或者設計的變動,經常需要對庫表增刪欄位,在項目團隊多人合作方式開發情況下,很容易遺漏對資料庫的修改,而遷移功能就很好地保證了這一點,“自動”記錄了模型變動需要對庫表進行的變更操作。
本教程所有文章導航
本系列共10篇文章,翻譯自Asp.Net MVC4 官方教程,由於本系列文章言簡意賅,篇幅適中,從一個樣本開始講解,全文最終完成了一個管理影片的小系統,非常適合新手入門Asp.Net MVC4,並由此開始開發工作。
原文供9篇文章,譯者將其中第6篇拆成了2篇
1. Asp.Net MVC4 入門介紹
· 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/intro-to-aspnet-mvc-4
· 譯文地址:http://www.cnblogs.com/seawaving/archive/2012/12/03/2800210.html
2. 添加一個控制器
· 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-controller
· 譯文地址:http://www.cnblogs.com/seawaving/archive/2012/12/04/2801949.html
3. 添加一個視圖
· 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-view
· 譯文地址:http://www.cnblogs.com/seawaving/archive/2012/12/04/2801988.html
4. 添加一個模型
· 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-model
· 譯文地址:http://www.cnblogs.com/seawaving/archive/2012/12/05/2803012.html
5. 從控制器訪問資料模型
· 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/accessing-your-models-data-from-a-controller
· 譯文地址:http://www.cnblogs.com/seawaving/archive/2012/12/05/2803429.html
6.查看Edit方法和Edit視圖
· 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/examining-the-edit-methods-and-edit-view
· 譯文地址:http://www.cnblogs.com/seawaving/archive/2012/12/05/2804100.html
http://www.cnblogs.com/seawaving/archive/2012/12/06/2804590.html
7. 為Movie模型和庫表添加欄位
· 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-new-field-to-the-movie-model-and-table
· 譯文地址:http://www.cnblogs.com/seawaving/archive/2012/12/06/2805401.html
8. 為模型添加驗證
· 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-validation-to-the-model
· 譯文地址:http://www.cnblogs.com/seawaving/archive/2012/12/06/2806322.html
9. 查看Detail和Delete方法
· 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/examining-the-details-and-delete-methods
· 譯文地址:http://www.cnblogs.com/seawaving/archive/2012/12/10/2811064.html