背景:
EF Code First在经历新业务或者业务逻辑变更时,可能会遇到数据库的更改,比如新增表
,更改表加字段,等等。这个时候,删除原来的数据库重建会丢失数据。
方案1:
如果初次开发,可以选择删除重建。
代码:
public TestDbContext()
: base("Name=TestConnection")
{
Database.SetInitializer<TestDbContext>(new DropCreateDatabaseIfModelChanges<TestDbContext>());
}
方案2:
使用EF代码迁移工具。
1,通过NugGet向项目添加EF,同时系统会添加一个迁移工具
2,Web.config或App.Config配置很重要,迁移工具会根据<entityFramework>节点寻找需要更新的数据库,如果是<defaultConnectionFactorytype="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">会寻找本地数据库,如果是<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" >会寻找远程数据库。当然这里还可以有其他配置,比如Oracle的配置。
3,自定义的DbContext的无参数构造函数必须指定连接串:
public class TestDbContext : DbContext
{
public TestDbContext()
: base("Name=TestConnection")
{
Database.SetInitializer<TestDbContext>(new DropCreateDatabaseIfModelChanges<TestDbContext>());
//Database.SetInitializer<TestDbContext>(null);
}
迁移工具会根据这个构造函数寻找数据库连接,默认的连接串为VS的MSLoaclDb数据库实例,这个地方需要注意。
4,准备好之后就可以开始迁移了,打开程序包管理器控制台。分三步输入指令:(示例如下)
PM> Enable-migrations
正在检查上下文的目标是否为现有数据库...
已为项目 MvcTestKO 启用 Code First 迁移。
PM> Add-Migration v1
正在为迁移“v1”搭建基架。
此迁移文件的设计器代码包含当前 Code First 模型的快照。在下一次搭建迁移基架时,将使用此快照计算对模型的更改。如果对要包含在此迁移中的模型进行其他更改,则您可通过再次运行“Add-Migration v1”重新搭建基架。
PM> Update-Database
指定“-Verbose”标志以查看应用于目标数据库的 SQL 语句。
正在应用显式迁移: [201903300817195_v1]。
正在应用显式迁移: 201903300817195_v1。
说明:
Enable-migrations后会生成一个迁移文件夹,里面会记录版本更迭状况
public partial class v1 : DbMigration { public override void Up() { CreateTable( "dbo.TestChilds", c => new { Id = c.String(nullable: false, maxLength: 128), createTime = c.DateTime(nullable: false), }) .PrimaryKey(t => t.Id); } public override void Down() { DropTable("dbo.TestChilds"); } }
public partial class v2 : DbMigration { public override void Up() { AddColumn("dbo.TestChilds", "Name", c => c.String()); } public override void Down() { DropColumn("dbo.TestChilds", "Name"); } }
Add-Migration v1 添加一个命名为v1的版本,添加好后会生成一个名叫 201903300817195_v1.cs的类。
PM> Update-Database 将迁移更新到数据库。更新完后,查看数据库会有更新 ,并且数据库的[__MigrationHistory]表会有相应的记录。