在本篇文章中,我們學習如何使用實體框架的“Code First Migrations ”(也稱為代碼先行功能)工具,使用其中的“遷移”功能對模型類進行一些修改,同時同步更新對應數據庫的表結構。
默認情況下,當您使用實體框架的“Code First Migrations ”工具,實體框架會自動創建一個數據庫。“代碼先行功能”首先會添加一個新表到數據庫中,以便跟蹤數據庫的架構是否與模型類同步。如果它們不同步,實體框架會拋出一個錯誤。這樣開發人員在開發時就能更容易地追查問題出在什么地方,而其他的開發方式就只能在運行時通過模糊的錯誤信息查找什么地方出錯了。
一、設置代碼優先遷移的模型更改
如果您使用的是Visual Studio 2012,從解決方案資源管理器中雙擊Test.mdf文件,會打開數據庫管理工具。其中Visual Studio Express For Web版本的VS將顯示數據庫資源管理器,Visual Studio 2012其他版本會顯示服務器資源管理器。如果您使用的是Visual Studio 2010中,使用SQL Server對象資源管理器。
1)在服務器資源管理器中—》“數據連接”中(數據庫管理工具、數據庫瀏覽器、服務器資源管理器或SQL Server對象資源管理器),右鍵單擊developer\sqlexpress.Test.dbo,然后選擇刪除。如下圖1、圖2。圖1是刪除連接,圖2是刪除數據庫。
圖1
圖2
2)執行菜單--》工具--》生成--》生成解決方案,以確保沒有錯誤。
3)從菜單--》工具菜單中,單擊庫程序包管理器--》程序包管理器控制臺。如下圖。
4)在Visual Studio的下方窗體中的“程序包管理器控制臺”窗口的“>”提示符下輸入“Enable-Migrations -ContextTypeName MvcApplication1.Models.BookDBContext”。如下圖。
5)在執行完Enable-Migrations命令之后(如上圖所示),會在項目中創建一個新的文件夾“Migrations”, 在這個文件夾中創建一個Configuration.cs文件。如下圖。
6)在Visual Studio中打開Configuration.cs文件。用下面的代碼替換Configuration.cs文件的Send方法:
namespace MvcApplication1.Migrations { using System; using System.Data.Entity; using System.Data.Entity.Migrations; using System.Linq; using MvcApplication1.Models; internal sealed class Configuration : DbMigrationsConfiguration<MvcApplication1.Models.BookDBContext> { public Configuration() { AutomaticMigrationsEnabled = false; } protected override void Seed(MvcApplication1.Models.BookDBContext context) { // This method will be called after migrating to the latest version. // You can use the DbSet<T>.AddOrUpdate() helper extension method // to avoid creating duplicate seed data. E.g. // // context.People.AddOrUpdate( // p => p.FullName, // new Person { FullName = "Andrew Peters" }, // new Person { FullName = "Brice Lambson" }, // new Person { FullName = "Rowan Miller" } // ); // context.Books.AddOrUpdate(i => i.BookID, new Book { Name = "When Harry Met Sally", PublishDate = DateTime.Parse("1989-1-11"), Category = "MS", AuthorID=1, Numberofcopies=12, Price = 7.99M }, new Book { Name = "Ghostbusters ", PublishDate = DateTime.Parse("1984-3-13"), Category = "MS", AuthorID=1, Numberofcopies=112, Price = 8.99M }, new Book { Name = "DB 2", PublishDate = DateTime.Parse("1986-2-23"), Category = "IBM", AuthorID=1, Numberofcopies=22, Price = 9.99M, } ); } } }
7)使用鼠標右鍵單擊Book下的紅色波浪線,在彈出菜單中選擇“解析”菜單項,然后在彈出菜單中選擇“MvcApplication1.Models”;如下圖。
在經過這樣做了之后,Visual Studio會自動在代碼中增加using語句如下:
using MvcApplication1.Models;
在“程序包管理器控制臺”窗口中執行了“Code First Migrations ”功能中的“遷移”命名之后,代碼會自動調用Send 方法(即程序包管理器控制臺會調用此方法更新數據庫中的數據),并且執行該方法時如果代碼中的對象數據不存在則插入,如果存在則進行更新。
二、遷移數據庫
1) 如果此時在Visual Studio中按Ctrl-Shift-B(或者菜單-->生成-->生成解決方案)來編譯項目,將會出現編譯不了的錯誤。如下圖。
2) 接下來要建立一個DbMigration類來進行初始遷移。使用這個遷移命名創建一個新的數據庫,這就是為什么我在上一步中刪除了Test.mdf文件。
3) 在程序包管理器控制臺窗口中,輸入命令“dd-migration Initial”創建初始遷移。其中“Initial”的命名是任意的,是用來命名新創建的遷移文件。如下圖。
4)“Code First Migrations ”功能中的“遷移”命名會在遷移文件夾中的創建一個新的類文件(名為{DATESTAMP}_Initial.cs),而且這個類中已經包含了創建數據庫架構的代碼。遷移文件名的命名規則中有一個固定的時間戳,用以幫助排序。檢查{DATESTAMP}_Initial.cs文件,它包含了創建Books表的數據庫的說明。這個{DATESTAMP}_Initial.cs文件將運行并創建數據庫架構。然后運行Send方法為數據庫填充測試數據。
5) 在程序包管理器控制臺,輸入命令“update-database”來創建數據庫,并執行Send方法。如下圖1,圖2。
圖1
圖2
如果你得到一個錯誤,指示表已經存在,不能被創建,它可能是因為你正在運行應用程序,在你刪除了數據庫之后,執行更新數據庫之前。(如上圖1)。
在這種情況下,再次刪除Test.mdf文件,然后重試“update-database”命令。如上圖2。如果仍然出現錯誤,請刪除該文件夾和內容,然后開始在這個頁面的頂部(也就是刪除Test.mdf文件然后進行啟用,遷移)的說明。
6) 按F5運行應用程序,在瀏覽器中瀏覽Books/Index網址。會顯示Send方法中填充到數據庫中的數據。如下圖。
文章列表