標籤:initial 設定 資料庫遷移 auto migrate ase nbsp 檔案 models
一、為模型更改設定 Code First 資料移轉
1、工具—>庫封裝管理員—>封裝管理員控制台—>輸入“Enable-Migrations” 或者
Enable-Migrations -ContextTypeName Mvc.Models.DataContext
Enable-Migrations -ContextTypeName 命名空間.上下文名稱
註:如果正確的話 則顯示“已為項目 xxx啟用 Code First 移轉。”,
Enable-Migrations命令建立了一個Migrations檔案夾和Configuration.cs檔案
2、封裝管理員控制台—>輸入“add-migration Initial”建立初始化遷移。
註:名稱“Initial”是隨意命名,即要添加的欄位。用來命名建立好的遷移檔案。
3、封裝管理員控制台—>輸入“update-database”
4、運行程式,更新完畢。
二、進一步
問題已經解決了,我們再來深入一下這種遷移方式。
當我們增加列(增加實體欄位)時,可以不必重複上面的所有操作。
1、只需要將\Migrations\Configuration.cs檔案中的AutomaticMigrationsEnabled = false;改成true
2、工具—>庫封裝管理員—>封裝管理員控制台—>輸入“update-database”
三、當我們刪除列(刪除實體欄位)時,同樣使用上面的操作,沒有成功,報會遺失資料,
所以不能簡單地執行“update-database”就能完成。
1、執行命令“add-migration Initial”
2、執行命令“update database”
3、運行程式,更新完畢
四、很強大的遷移
public class ContactContext : DbContext
{
public ContactContext()
: base("name=DefaultConnection")
{
//自動建立表,如果Entity有改到就更新到表結構
Database.SetInitializer<ContactContext>(new MigrateDatabaseToLatestVersion<ContactContext, ReportingDbMigrationsConfiguration>());
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); //表名為類名,不是上面帶s的名字 //移除複數表名的契約
modelBuilder.Conventions.Remove<IncludeMetadataConvention>(); //不建立EdmMetadata表 //防止黑幕交易 要不然每次都要訪問 EdmMetadata這個表
}
public DbSet<City> Cities { get; set; }
public DbSet<Area> Area { get; set; }
public DbSet<Campaign> Campaign { get; set; }
}
internal sealed class ReportingDbMigrationsConfiguration : DbMigrationsConfiguration<ContactContext>
{
public ReportingDbMigrationsConfiguration()
{
AutomaticMigrationsEnabled = true;//任何Model Class的修改將會直接更新DB
AutomaticMigrationDataLossAllowed = true;
}
}
codefirst資料庫遷移