项目中用到了EF Code First和迁移,但发现有些方面似懂非懂。好比:如何在迁移文件中控制迁移过程?若是在迁移文件中执行SQL语句?如何使用Update-Database的其它参数?数据库在生产环境的时候如何迁移?因而就有了下面的这些体验:
enable-migration
第一次生成数据库时使用。
→ enable-migration
→ 在类库下多了Migrations文件夹,包含Configuration.cs和每次的迁移记录文件
每次的迁移文件大体是:sql
public partial class InitialCreae : DbMigration { public override void Up() { CreateTable( "Aliases", c => new { Id = c.Int(nullable: false, identity: true), Name = c.String(nullable: false), UserName = c.String(maxLength:30), Email = c.String(), Bio = c.String(), CreateDate = c.DateTime(nullable: false) } ) .PrimaryKey(t => t.Id); CreateTable( "Tweets", c => new { Id = c.Int(nullable: false, identity:true), CreateDate = c.DateTime(nullable: false), AliasId = c.Int(nullable:false) } ) .PrimaryKey(t => t.Id) .ForeignKey("Aliases", t => t.AliasId, cascadeDelete: true) .Index(t => t.AliasId); } public override Down() { DropIndex("Tweets", new[]{"AliasId"}); DropForeignKey("Tweets", "AliasId", "Aliases"); DropTable("Tweets"); DropTable("Aliases"); } }
迁移的配置文件大体是:数据库
internal sealed class Configuration : DbMigrationsConfiguration<TweeterContext> { public Configuration() { AutomatecMigrationsEnabled = false; } protected override void Seed(TwitterContext context) { } }
数据库初始化
Database.SetInitializer(new MigrateDatabaseToLastesVerstion<TwitterContext, Configuration>());
自动或手动迁移设置ide
public class Configuration : : DbMigrationsConfiguration<TweeterContext> { public Configuration() { //若是手动迁移,设置成false AutomaticMigrationsEnabled = true; //即便列中有数据,这个列也能够被删除,删除的时候只是少了该列的数据 AutomaticMigrationDataLossAllowd = true; } }
Add-Migration
每次迁移保存在本地。
配置文件大体以下:spa
public class Configuration : DbMigrationsConfiguration<TwitterContext> { public Configuraiton() { AutomatcMigrationsEnabled = false; AutomaticMigrationDataLossAllowed = true; } protected override void Seed(TwitterContext context) { } }
→ 好比增长一个列
→ 运行: Add-Migration somename
→ 迁移文件大体是
code
public partial class AddSomeColumnToSomeTable : DbMigration { public override void up() { AddColumn("sometable", "somecolumn", c => c.String()); } public override void Down() { DropColumn("sometable", "somecolumn"); } }
Update-Database
更新数据库,执行没有被执行的迁移文件。
→ 执行:update-database -verbose
verbose表示显示更新明细,会显示执行了哪些迁移,执行了哪些SQL语句。
→ 其它参数
TargetMigration
Script & SourceMigration:建立SQL语句
Force:容许数据丢失
ProjectName:DbMigrationsConfiguraiton所在的类库
ConfigurationTypeName:DbMigrationsConfiguration的继承类
SartUpProjectName:链接字符串所在的类库
ConnectionString & ConnectionProviderName:明确链接字符串或provider
或者经过:get-help update-database -detailed, 了解更多。
回滚
Update-Database -TargetMigration:"SomeMigrationName" -verbose
在迁移文件中自定义一些迁移动做,控制迁移过程
全部的迁移文件继承自DbMigration这个类,该类提供了不少方法供咱们控制迁移过程。
→ 好比让增长的类有一个默认值
blog
public partial class AddSomeColumn : DbMigration { public override void Up() { AddColumn("sometable", "somecolumn", c => c.String(defaultValue: "sth")); } public override void Down() { DropColumn("sometable", "somecolumn"); } }
执行SQL语句
好比,现有数据的某些列为NULL,若是想给这些行的该列附上值,该如何作呢?
→ 改变领域模型
→ 执行:Add-Migration somename
→ 在迁移文件中执行SQL语句继承
public partial class AddSome : DbMigration { public override void Up() { AddColumn("table", "column", c => c.String(maxLength:10)); Sql("Update table set column='sth'"); } public override void Down() { DropColumn("table", "column"); } }
→ Update-Database -verbose
数据库的种子数据ip
public class Configuration : DbMigrationsConfiguraiton<TwitterCotext> { public Configuration() { AutomaticMigrationsEnabled = false; AutomaticMigraitoinDataLossAllowed = true; } protected override void Seed(TwitterContext context) { context.Aliases.AddOrUpdate(a => a.Name, new Alias{}, new ALias()) } }
对生产环境下的数据库做迁移
→ 执行:udb -script -verbose
→ 弹出一个能够编写sql语句的窗口,此时没有与数据库链接
alter table sometable add column nvarchar(max)
insert into _MigrationHistory(MigrationId,CreatedOn, Model, ProductVersion) values(...)
→ 执行:udb -verbose
此时与数据库链接,执行语句
→ 若是想从某个一个迁移开始
udb -sourcemigration:"somename" -script
→ 执行: udb -verbose
关闭种子数据
Database.SetIntializer<SomeContext>(null);
字符串