ASP.NET MVC 之CodeFirst 數據遷移
CodeFirst模式下如果 一個 類的屬性 增加或者刪除 那麽 與其對應的 就是 數據庫中所對應的 字段 增加或者刪除 一個屬性變化還好 ,我們直接可以到數據庫中找到 ,所對應的表中,對其修改,那麽 一次對多個類中的屬性做修改,如果 手動 來操作是件很頭疼的事情 那麽數據遷移 很輕松的解決 問題
以下是 我建立的上下文 TestEF
用於測試 用的 班級類 老師類
namespace WebApplication2 { using System; using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Data.Entity; using System.Linq; public class TestEF : DbContext { //您的上下文已配置為從您的應用程序的配置文件(App.config 或 Web.config) //使用“TestEF”連接字符串。默認情況下,此連接字符串針對您的 LocalDb 實例上的 //“WebApplication1.TestEF”數據庫。 // //如果您想要針對其他數據庫和/或數據庫提供程序,請在應用程序配置文件中修改“TestEF” //連接字符串。 public TestEF() : base("name=TestEF") {
} //為您要在模型中包含的每種實體類型都添加 DbSet。有關配置和使用 Code First 模型 //的詳細信息,請參閱 http://go.microsoft.com/fwlink/?LinkId=390109。 public DbSet<Teacher> Teacher { get; set; } public DbSet<Grade> Grade { get; set; } } [Description("老師")] public class Teacher { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)]//自增長 public int ID { get; set; } [Description("姓名")] public string Name { get; set; } //[Description("年齡")] // public int Age { get; set; } public ICollection<Grade> Grades { get; set; } } [Description("班級")] public class Grade { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int ID { get; set; } [Description("班級名稱")] public string Name { get; set; } public ICollection<Teacher> Teacheres { get; set; } } }
第二步 打開nuget 程序包管理控制平臺
第三步 輸入命令 Enable-Migrations -ContextTypeName WebApplication2.Models.ApplicationDbContext
這時會看到項目下回生成一個文件夾名稱為Migrations 他的英文翻譯為 遷移的意思 文件夾裏有個Configuration 類 在構造函數中 有個屬性 為AutomaticMigrationsEnabled 他的意思為 是否 啟用數據遷移 我們修改為true 還要設置 一個屬性 AutomaticMigrationDataLossAllowed = true; 這個屬性的意思為是否允許 數據丟失 ,如果數據庫已經生成完畢,但是 我要刪除Teacher類中某一個屬性 如果 這個屬性 沒有設置為true 那麽 會報錯, 提示你 要設置 允許數據丟失麽。
第四步 在 MvcApplication 類中 設置數據庫初始化 代碼為 Database.SetInitializer(new MigrateDatabaseToLatestVersion<TestEF, Migrations.Configuration>("TestEF"));
然後我在 HomeController Index 中搞點數據
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace WebApplication2.Controllers { public class HomeController : Controller { public ActionResult Index() { TestEF test = new TestEF(); List<Teacher> teachers = new List<Teacher>(); List<Grade> grades = new List<Grade>(); Teacher teacher = new Teacher { Name = "老師" , Grades =grades }; Grade grade = new Grade { Name ="一年一班" , Teacheres =teachers}; teacher.Grades.Add(grade); grade.Teacheres.Add(teacher); test.Teacher.Add(teacher); test.Grade.Add(grade); test.SaveChanges(); return View(); } public ActionResult About() { ViewBag.Message = "Your application description page."; return View(); } public ActionResult Contact() { ViewBag.Message = "Your contact page."; return View(); } } }
這個時候 啟動項目 看數據庫 會看到數據庫已經生成好
這個時候當我們修改 Teacher 類時 添加一個Age 屬性 那麽 看看數據庫會發生什麽變化,這時 我們會看到數據庫Teacher表中會多出Age列
現在 我要把Teacher類中的 Age屬性刪除 看看 數據庫會不會 自動 的刪除掉該列 , 提醒 因為我們在Migrations 文件夾中的Configuration 設置了 允許數據丟失 所以該操作不會報錯 ,如果報錯 請設置AutomaticMigrationDataLossAllowed = true
只剩下 ID和 Name 列了。
寫的不是很好,請大家多多見諒!
ASP.NET MVC 之CodeFirst 數據遷移