使用EntityFramework Code First開發(fā),數(shù)據(jù)遷移是一個不得不提的技術。
在我們的開發(fā)過程中,難免需要對模型進行改進横腿,模型改進后颓屑,會導致實體集與數(shù)據(jù)庫不一致,當然我們可以通過刪除數(shù)據(jù)庫然后再重構數(shù)據(jù)庫耿焊,但是在生產環(huán)境中這樣做揪惦,這樣或多或少會出現(xiàn)一些問題。使用“數(shù)據(jù)遷移”搀别,可以幫助我們解決這個問題丹擎。
數(shù)據(jù)遷移,添加的是我們對數(shù)據(jù)庫的改動歇父,這一點可以從下面Demo中可以看出來蒂培。每對數(shù)據(jù)庫進行一次改動(如刪除了某個表,更改了某一列)榜苫,添加一次數(shù)據(jù)遷移护戳,然后更新數(shù)據(jù)庫,這樣就能夠達到我們的目的垂睬。
先說一下我用的工具:
Vs2015 pro
Sql Serer 2014 developer
現(xiàn)在微軟的開發(fā)工具開發(fā)者版都免費了媳荒,個人用戶的話用起來還是會比較舒服的。
接下來放上一個小的Demo
新建一個空白解決方案(文件-新建-項目-其他項目類型-空白解決方案)Demo
然后添加兩個類庫驹饺,分別命名為Demo.Model和Demo.DAL钳枕。
添加一個Web應用程序(MVC),命名為Demo.UI
分別為Demo.Model赏壹、Demo.UI鱼炒、Demo.DAL安裝EntitFramework。
程序包管理控制臺輸入
Install-Package EntityFramwork
在Demo.Model中添加一個User類
namespace Demo.Model
{
public class User
{
public int UserId { get; set; }
public string UseraName { get; set; }
public string Password{ get; set; }
}
}
在Demo.DAL中添加一個DemoDbContext類蝌借,該類繼承自DbContext類昔瞧,作用主要是對數(shù)據(jù)庫結構的映射(個人理解)。
using Demo.Model;
using System.Data.Entity;
namespace Demo.DAL
{
public class DemoDbContext:DbContext
{
public DemoDbContext() : base("Name=DefaultConnection")
{
}
//添加User表
public IDbSet<User> Users { get; set; }
}
}
開啟數(shù)據(jù)遷移
在程序包管理控制臺輸入(不區(qū)分大小寫):
Enable-Migrations
執(zhí)行完可以發(fā)現(xiàn)菩佑,這里新建了一個名為 Migration
的文件夾和一個配置文件
然后進行下一步操作自晰,設置 Demo.UI
為啟動項目
然后修改Web.config中的ConnectionString屬性
<connectionStrings>
<add name="DefaultConnection" connectionString="Data Source=.;User Id=sa;Password=123; Database=DemoDbContext" providerName="System.Data.SqlClient" />
</connectionStrings>
這里定義的是連接字符串,不同的 Sql 版本對應的連接字符串可能會不一致稍坯,Sql Server Express 版本默認的實例名為 SQLEXPRESS
所以連接字符串應為
<connectionStrings>
<add name="DefaultConnection" connectionString="Data Source=./sqlexpress;User Id=sa;Password=123; Database=DemoDbContext" providerName="System.Data.SqlClient" />
</connectionStrings>
這里注意一下 Database
屬性酬荞,這里定義的為數(shù)據(jù)庫的名稱,這里要與前面定義的 DemoDbContext
保持一致瞧哟。
配置好以后袜蚕,在程序包管理控制臺窗口輸入
Add-Migration Add_User_Entity
這樣我們就添加了一次數(shù)據(jù)遷移,數(shù)據(jù)遷移的名稱為 Add_User_Entity
執(zhí)行完之后會發(fā)現(xiàn)绢涡,Migration
文件夾添加了一個配置文件 201709250342176_Add_User_Entity.cs
前面是時間,后面是我們數(shù)據(jù)遷移的名字遣疯。
![](https://raw.githubusercontent.com/nikons5456/Images/master/%E6%95%B0%E6%8D%AE%E8%BF%81%E7%A7%BB/06.jpg)
添加測試數(shù)據(jù)
在 Demo.DAL
中 Migration
文件夾中添加一個名為 Seed
的文件夾
添加一個 UserSeed
類
using Demo.Model;
namespace Demo.DAL.Migrations.Seed
{
public class UserSeed
{
public readonly DemoDbContext _dbcontext;
public UserSeed(DemoDbContext context)
{
_dbcontext = context;
}
public void Create()
{
AddSeed();
}
public void AddSeed()
{
User User = new User
{
Password = "123",
UseraName = "Niko"
};
_dbcontext.Users.Add(User);
_dbcontext.SaveChanges();
}
}
}
在 Migration
文件夾 Configuration.cs
中添加
protected override void Seed(Demo.DAL.DemoDbContext context)
{
//添加種子數(shù)據(jù)
new UserSeed(context).Create();
}
添加完以后雄可,執(zhí)行最后一步 —— 更新數(shù)據(jù)庫
在程序包管理控制臺輸入
Update-Database
或者
Update-Database -Verbose
后者會在控制臺輸出對數(shù)據(jù)庫的操作過程凿傅,這樣我們在數(shù)據(jù)庫中就建立了一個名為 DemoDbContext
的數(shù)據(jù)庫,并在里面添加了一個 Users
表数苫,并添加了我們想要的測試數(shù)據(jù):
以后每對數(shù)據(jù)庫進行一次改動聪舒,就添加一次數(shù)據(jù)遷移,然后更新數(shù)據(jù)庫虐急,即可實現(xiàn)我們的目的箱残。