项目中用到了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. 关于内存数据与 JSON

    闲话: 正在用 WebBroker 写一个小网站,感受颇多: 1.如果是写一个小东西,应该先考虑下 WebBroker,因为它是分分钟即可上手的. 2.如果要写一个大东西,或许也应该考虑下 WebBr ...

  2. Training Deep Neural Networks

    http://handong1587.github.io/deep_learning/2015/10/09/training-dnn.html  //转载于 Training Deep Neural ...

  3. ActiveX控件dsoFramer的使用(word、excel、PPT)

    dsoframer是微软提供一款开源的用于在线编辑.调用Word. Excel .PowerPoint等的ActiveX控件.国内很多著名的OA中间件,电子印章,签名留痕等大多数是依此改进而来的. 一 ...

  4. SQL语句一次INSERT多条记录的方法

    1.SQL Server或MySQL中: INSERT INTO `userTable` (`user_id`, `user_name`) VALUES (, 'dsf'), (, 'fgy'), ( ...

  5. 纯css径向渐变(CSS3--Gradient)

    渐变 一.CSS3的径向渐变 效果图网址:http://www.spritecow.com 图像拼接技术 CSS3 Gradient分为linear-gradient(线性渐变)和radial-gra ...

  6. 第二章——建立一个HelloWorld项目,练习使用git的add/commit/push/pull/fetch/clone等基本命令。比较项目的新旧版本的差别-----答题者:徐潇瑞

    1.首先下载安装git,很简单所以就不详细说了,当弹出一个类似的命令窗口的东西,就说明Git安装成功 2.因为Git是分布式版本控制系统,所以需要填写用户名和邮箱作为一个标识 3.接着,注册githu ...

  7. 如何查看 oracle 官方文档

    Concept 包含了 oracle 数据库里面的一些基本概念和原理, 比如 数据库逻辑结构, 物理结构, 实例结构, 优化器, 事务等. PDF 460页 Reference 包含了动态性能视图, ...

  8. iOS 直播(一)

    由于业务需求,需要从腾讯直播sdk要迅速转移到自主开发(先让我默哀三分钟).不多说,直接开始唠嗑! 这个项目超级简单,简单到只能一个推流,一个拉流的功能.需求多的再另谈. 前期准备:推流用优酷开源的L ...

  9. jdk下载与安装及配置环境变量

    1.下载jdk 地址为:http://www.oracle.com/technetwork/java/javase/downloads/index.html2.安装jdk3.搭建环境变量    永久配 ...

  10. SQL 注入

    我们的团队项目中有课程名称输入框,其中的内容会拼接到类sql查询语句中. 所以可能会产生类sql注入的问题,我们团队采用了利用正则表达式判断输入内容的形式来规避这类注入. 下面简单介绍一下sql注入 ...