项目中用到了EF Code First和迁移,但发现有些方面似懂非懂。比如:如何在迁移文件中控制迁移过程?如果在迁移文件中执行SQL语句?如何使用Update-Database的其它参数?数据库在生产环境的时候如何迁移?于是就有了下面的这些体验:

enable-migration

第一次生成数据库时使用。

→ enable-migration
→ 在类库下多了Migrations文件夹,包含Configuration.cs和每次的迁移记录文件

每次的迁移文件大致是:

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:),
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>());

自动或手动迁移设置

public class Configuration : : DbMigrationsConfiguration<TweeterContext>
{
public Configuration()
{
//如果手动迁移,设置成false
AutomaticMigrationsEnabled = true; //即使列中有数据,这个列也可以被删除,删除的时候只是少了该列的数据
AutomaticMigrationDataLossAllowd = true;
}
}

Add-Migration

每次迁移保存在本地。

配置文件大致如下:

public class Configuration : DbMigrationsConfiguration<TwitterContext>
{
public Configuraiton()
{
AutomatcMigrationsEnabled = false;
AutomaticMigrationDataLossAllowed = true;
} protected override void Seed(TwitterContext context)
{ }
}

→ 比如增加一个列

→ 运行: Add-Migration somename

→ 迁移文件大致是

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这个类,该类提供了很多方法供我们控制迁移过程。

→ 比如让增加的类有一个默认值

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:));
Sql("Update table set column='sth'");
} public override void Down()
{
DropColumn("table", "column");
}
}

→ Update-Database -verbose

数据库的种子数据

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);

Entity Framework Code First迁移基本面拾遗的更多相关文章

  1. Entity Framework Code First 迁移

    Entity Framework CodeFirst数据迁移 http://www.cnblogs.com/aehyok/p/3325459.html Entity Framework Code Fi ...

  2. ASP.NET MVC+Entity Framework code first 迁移

    再来一张,选择 MVC 模版,其他的没选过,不会用 =_=!! 身份验证用个人用户账户,这个是为了偷懒,话说 ASP.NET Identity  还是很给力的,不用白不用 ^_^~ 点击确定之后,会看 ...

  3. Entity Framework Code First 迁移数据库

    新版EF,系统实现过程中如果对Model进行更改,队形修改数据库并不能正常运行项目,需要借助Code First 手动迁移数据库 首先启用迁移,允许迁移Context Tools->Librar ...

  4. Entity FrameWork Code First 迁移命令详解

    1. Enable-Migrations 启动迁移 执行get-help Enable-Migrations –detailed 查看Enable-Migrations的详细用法. -ContextT ...

  5. Entity Framework Code First 数据迁移

    需要在[工具 --> NuGet 程序包管理器 --> 程序包管理器控制台]中输入三个命令: Enable-Migrations (初次迁移时使用) Add-Migration [为本次迁 ...

  6. Entity Framework Code First学习系列目录

    Entity Framework Code First学习系列说明:开发环境为Visual Studio 2010 + Entity Framework 5.0+MS SQL Server 2012, ...

  7. Entity Framework CodeFirst数据迁移

    前言 紧接着前面一篇博文Entity Framework CodeFirst尝试. 我们知道无论是“Database First”还是“Model First”当模型发生改变了都可以通过Visual ...

  8. Entity Framework Code First学习系列

    Entity Framework Code First学习系列目录 Entity Framework Code First学习系列说明:开发环境为Visual Studio 2010 + Entity ...

  9. Entity Framework Code first(转载)

    一.Entity Framework Code first(代码优先)使用过程 1.1Entity Framework 代码优先简介 不得不提Entity Framework Code First这个 ...

随机推荐

  1. Floyd | | jzoj[1218] | | [Usaco2009 Dec]Toll 过路费 | | BZOJ 1774 | | 我也不知道该怎么写

    写在前面:老师说这一道题是神题,事实上确实如此,主要是考察对Floyd的理解 ******************************题目.txt************************* ...

  2. zend 汉化

    http://jingyan.baidu.com/article/4f34706ecdb566e387b56d05.html

  3. cinder backup

    cinder 备份提供的驱动服务有: cinder/backup/drivers/ceph.py:def get_backup_driver(context): cinder/backup/drive ...

  4. servers中添加server时,看不到运行环境的选择。

    servers中添加server时,看不到运行环境的选择. 主要原因是tomcat目录中的配置文件格式不对.

  5. jquery 获取radio选中的值

    如下案例:常用方法 1.获取选中值,三种方法都可以: $('input:radio:checked').val(): $("input[type='radio']:checked" ...

  6. linux freetds操作mssql

    1.安装freetds wget http://mirrors.ibiblio.org/freetds/stable/freetds-stable.tgz tar xvzf freetds-stabl ...

  7. WPF RichTextBox,关键字搜索,样式改变,超链接替换,图文混排

    RichTextBox 只是一个控件,表示对 FlowDocument 对象执行操作的丰富编辑控件.它所承载的内容由其 Document 属性来呈现. Document 是一个 FlowDocumen ...

  8. 对IEnumerable<T>和IQueryable<T>的一点见解

    今天学习了用EF模型做查询,感觉数据库上下文对象的扩展方法很强大,所以研究了一下where的实现原理,其中遇到了一个问题,就是关于IEnumerable和IQueryable的区别,所以查了查资料,这 ...

  9. 响应式Web设计(Responsive Web design)的理念

    页面的设计与开发应当根据用户行为以及设备环境(系统平台.屏幕尺寸.屏幕定向等)进行相应的响应和调整.具体的实践方式由多方面组成,包括弹性网格和布局.图片.CSS media query的使用等.无论用 ...

  10. andriod终端操作命令

    1.卸载大厅安装包,如果卸载不掉的话,添加-r pm uninstall -r com.scigames.egm.lobby 2.查找包含"scigames"的安装包 3.卸载一个 ...