標籤:
背景
code first起初當修改model後,要持久化至資料庫中時,總要把原資料庫給刪除掉再建立(DropCreateDatabaseIfModelChanges),此時就會產生一個問題,當我們的舊資料庫中包含一些測試資料時,當持久化更新後,原資料將全部丟失,故我們可以引入EF的資料移轉功能來完成。
要求
- 已安裝NuGet
過程樣本原model
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Data.Entity;namespace MvcApplication1.Models{ public class Movie { public int ID { get; set; } public string Title { get; set; } public DateTime ReleaseDate { get; set; } public string Genre { get; set; } public decimal Price { get; set; } public string Rating { get; set; } } public class MovieDBContext : DbContext { public DbSet<Movie> Movies { get; set; } }}
//新model
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Data.Entity;namespace MvcApplication1.Models{ public class Movie { public int ID { get; set; } public string Title { get; set; } public DateTime ReleaseDate { get; set; } public string Genre { get; set; } public decimal Price { get; set; } public decimal VipPrice { get; set; } public string Rating { get; set; } } public class MovieDBContext : DbContext { public DbSet<Movie> Movies { get; set; } }}
註:區別在於,我們給Movie新加了一個VipPrice屬性。
接下來,我們將開始持久化此model至資料庫中(我們現在只是對屬性作修改,此時資料庫中此欄位的長度為nvarchar(max),並不是nvarchar(10))
1:在config中設定資料庫串連:
<connectionStrings> <add name="MovieDBContext" connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\Movies.mdf;Integrated Security=True" providerName="System.Data.SqlClient" /> </connectionStrings>
2:開啟NuGet控制台:
3:運行命令Enable-Migrations
可能會出現如下錯誤:
PM> Enable-MigrationsMore than one context type was found in the assembly ‘MvcApplication1‘.To enable migrations for MvcApplication1.Models.UsersContext, use Enable-Migrations -ContextTypeName MvcApplication1.Models.UsersContext.To enable migrations for MvcApplication1.Models.MovieDBContext, use Enable-Migrations -ContextTypeName MvcApplication1.Models.MovieDBContext.To enable migrations for MvcApplication1.PurchaseRequestEntities, use Enable-Migrations -ContextTypeName MvcApplication1.PurchaseRequestEntities.
這是因為我之前 執行過 Enable-Migrations ,系統提示我已經存在MvcApplication1 context
此時項目會出現如下檔案夾:
開啟configuation.cs,將作出如下修改:
public Configuration() { AutomaticMigrationsEnabled = true; }
4:再次執行Update-Database:
如下:
PM> Update-Database指定“-Verbose”標記以查看應用於目標資料庫的 SQL 陳述式。無任何待定的基於代碼的遷移。正在應用自動遷移: 201501220847062_AutomaticMigration。正在運行 Seed 方法。
如果確保沒事,只需給此命令加個強制執行的參數即可:
Enable-Migrations -Force
最後再次執行:Update-Database
資料庫中已經增加VipPrice欄位
資料庫中的原資料也沒有丟失!
ASP.NET MVC4 新手入門教程特別篇之一----Code First Migrations更新資料庫結構(資料移轉)修改Entity FrameWork 資料結構(不刪除資料)