前面七篇基本把Code First学习了一下,不过code first中会出现一个问题,就是数据迁移的问题。

一、数据准备

还是在前面的demo上修改,这次使用Province和City类。

    public class Province
{
[Key]
public string ProvinceId { get; set; } public string ProvinceName { get; set; } public virtual ICollection<City> Citys { get; set; }
}
}
    public class City
{
public int CityId { get; set; } public string CityName { get; set; } public string ProId { get; set; } [ForeignKey("ProId")]//ProId一对要存在
public Province Province { get; set; } }
        static void Main(string[] args)
{
City cityA = new City() { CityName = "驻马店" };
City cityB = new City() { CityName = "周口" };
Province province = new Province() {ProvinceId="", ProvinceName = "河南省", Citys = new List<City>() { cityA, cityB } };
using (var db = new EFCodeFirstDbContext())
{
db.Provinces.Add(province);
db.SaveChanges();
Console.WriteLine("Success");
}
Console.ReadKey();
}

上面的会在数据库映射如下面的数据表

二、数据迁移

1.增加属性

在City类中增加一个属性 Description,在创建City对象时增加Description,再次运行会报下面的错误。

通过下面图的步骤打开程序包管理器控制台.

在上面的控制台输入下面的code,这个在默认项目上要选择正确,会在项目上增加Migrations文件夹和Configuration.cs类。

Enable-Migrations -EnableAutomaticMigrations

namespace EFCodeFirstDataAccess.Migrations
{
using System;
using System.Data.Entity;
using System.Data.Entity.Migrations;
using System.Linq; internal sealed class Configuration : DbMigrationsConfiguration<EFCodeFirstDataAccess.EFCodeFirstDbContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = true;
ContextKey = "EFCodeFirstDataAccess.EFCodeFirstDbContext";
} protected override void Seed(EFCodeFirstDataAccess.EFCodeFirstDbContext context)
{
// This method will be called after migrating to the latest version. // You can use the DbSet<T>.AddOrUpdate() helper extension method
// to avoid creating duplicate seed data. E.g.
//
// context.People.AddOrUpdate(
// p => p.FullName,
// new Person { FullName = "Andrew Peters" },
// new Person { FullName = "Brice Lambson" },
// new Person { FullName = "Rowan Miller" }
// );
//
}
}
}

然后执行下面的code

Add-Migration InitialCreate

然后会生成一个201609061311422_InitialCreate.cs类。

namespace EFCodeFirstDataAccess.Migrations
{
using System;
using System.Data.Entity.Migrations; public partial class InitialCreate : DbMigration
{
public override void Up()
{
AddColumn("dbo.Cities", "Description", c => c.String());
} public override void Down()
{
DropColumn("dbo.Cities", "Description");
}
}
}

执行下面的code生成与上面一致的数据库

Update-Database -Verbose

此时再次运行上面的C#代码就不会再报错。而且数据库的结构也和C#的相对应了。

2.增加类

在数据库模型中添加User类,执行程序包管理器控制台语句,Migrations文件夹中新增类文件

 Add-Migration AddUser

此时会在项目中增加201609061323573_AddUser.cs类。

namespace EFCodeFirstDataAccess.Migrations
{
using System;
using System.Data.Entity.Migrations; public partial class AddUser : DbMigration
{
public override void Up()
{
CreateTable(
"dbo.Users",
c => new
{
UserId = c.Int(nullable: false, identity: true),
Name = c.String(),
Age = c.Int(nullable: false),
})
.PrimaryKey(t => t.UserId); } public override void Down()
{
DropTable("dbo.Users");
}
}
}

再次执行下面的code

 Update-Database -Verbose

此时再次运行C#项目会在数据库中映射出一个Users表

3.删除属性

这次删除User类中的Age属性。依次执行下面的两行

Add-Migration ModifyUser

上面的一行会生成一个201609061334085_ModifyUser.cs类。

namespace EFCodeFirstDataAccess.Migrations
{
using System;
using System.Data.Entity.Migrations; public partial class ModifyUser : DbMigration
{
public override void Up()
{
DropColumn("dbo.Users", "Age");
} public override void Down()
{
AddColumn("dbo.Users", "Age", c => c.Int(nullable: false));
}
}
}

然后更新到数据库

Update-Database -Verbose

4.版本回溯

在项目中可能会存在版本回溯的情况,code first也有对应的解决方案。

Update-Database –TargetMigration: AddUser

Update-Database -Verbose

如果你想回滚一切至空数据库,可以使用命令 Update-Database –TargetMigration: $InitialDatabase,此时要在Configuration.cs中设置AutomaticMigrationDataLossAllowed = true;

5.生成数据库版本之间的Sql脚本

执行程序包管理器控制台语句,生成数据库版本之间的Sql脚本。该操作仅为生成Sql语句,并未在数据库中进行执行。其中-TargetMigration在未指定的情况,默认为迁移到最新的版本。

 Update-Database -Script -SourceMigration:InitialCreate -TargetMigration:ModifyUser

EF实体框架之CodeFirst八的更多相关文章

  1. EF实体框架之CodeFirst四

    在EF实体框架之CodeFirst二中也提到数据库里面一般包括表.列.约束.主外键.级联操作.实体关系(E-R图).存储过程.视图.锁.事务.数据库结构更新等.前面几篇博客把表.存储过程.视图这些算是 ...

  2. EF实体框架之CodeFirst一

    对于SQL Server.MySql.Oracle等这些传统的数据库,基本都是关系型数据库,都是体现实体与实体之间的联系,在以前开发时,可能先根据需求设计数据库,然后在写Model和业务逻辑,对于Mo ...

  3. EF实体框架之CodeFirst五

    上一博客学习了下基本的约定配置,留下几个遗漏的,这篇就是学习下遗漏一复杂类型. 一.什么是复杂类型? 书中说道:“复杂类型也可视作值类型(?)可以作为附加属性添加到其他类.复杂类型与实体类型的区别在于 ...

  4. EF实体框架之CodeFirst二

    在codefirst一中也说了Mapping是实体与数据库的纽带,model通过Mapping映射到数据库,我们可以从数据库的角度来分析?首先是映射到数据库,这个是必须的.数据库里面一般包括表.列.约 ...

  5. EF实体框架之CodeFirst七

    前面的6篇博客基本把Code First学习的差不多了,今天这篇学习下code first中的并发控制和事务,基本也快学完了,顶多就差数据迁移. 在数据库中也是有锁和事务的概念,在C#中也是存在,当然 ...

  6. EF实体框架之CodeFirst六

    上午的时候把复杂类型学习了一下,想着趁着周六日把Code First学习完,所以下午还是把Code First中的关系学习下.在数据库中最重要的恐怕就是E-R图了,E-R体现了表与表直接的关系.使用C ...

  7. EF实体框架之CodeFirst三

    前两篇博客学习了数据库映射和表映射,今天学习下数据库初始化.种子数据.EF执行sql以及执行存储过程这几个知识. 一.数据库初始化策略 数据库初始化有4种策略 策略一:数据库不存在时重新创建数据库 D ...

  8. C#.Net EF实体框架入门视频教程

    当前位置: 主页 > 编程开发 > C_VC视频教程 > C#.Net EF实体框架入门视频教程 > kingstone金士顿手机内存卡16G仅65元 1.EF实体框架之增加查 ...

  9. EF实体框架处理实体之间关联关系与EF延迟机制(下)

    在数据库中,表与表之间可能存在多种联系,比如,一对多,多对多的关系.当我们使用逻辑外键在数据库建立两张表之间的关系的时候,我们使用EF实体框架 必然也会将这种关系映射到我们的实体关系中来.所以,在我们 ...

随机推荐

  1. 以前写的关于Linux C/C++的博客

    以前在CU写的关于Linux C/C++的博客 http://blog.chinaunix.net/uid/25909722/cid-24318-list-1.html

  2. C/S架构程序多种类服务器之间实现单点登录(转)

    (一) 在项目开发的过程中,经常会出现这样的情况:我们的产品包括很多,以QQ举例,如登陆.好友下载.群下载.网络硬盘.QQ游戏.QQ音乐等,总不能要求用户每次输入用户名.密码吧,为解决这个问题,高手提 ...

  3. 面向对象and类

    类和对象: 1.什么叫类:类是一种数据结构,就好比一个模型,该模型用来表述一类事物(事物即数据和动作的结合体),用它来生产真实的物体(实例). 2.什么叫对象:睁开眼,你看到的一切的事物都是一个个的对 ...

  4. git_sop 脚本使用说明

    tags : git 前言 脚本下载地址: git是功能非常强大的版本管理工具,同时它带来的是学习成本的上升.最近我们团队的部分项目采用了git进行版本管理,一部分小伙伴对于git使用不是很熟悉.一方 ...

  5. STL的erase()陷阱-迭代器失效总结

    下面材料整理自Internet&著作. STL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector .deque):另一类是以不连续的节点形式存储的容器(如:list.s ...

  6. 杂谈SharpDx中的WIC组件——我们需要WIC的图片编码功能么?

    在前文 SharpDX之Direct2D教程II——加载位图文件和保存位图文件 中,发现在VB2010中不能很好的运用SharpDx中的WIC组件进行图片的编码工作.可能是我的设置问题,也可能是Sha ...

  7. [本人开发的游戏] Discuz网页动物园插件1.0Beta发布!让积分流动起来!

        插件发布 插件名称: DZ网页动物园插件 插件来源: 原创插件 适用版本: Discuz! X3 语言编码: GBK简体 UTF8简体 BIG5繁体 UTF8繁体  最后更新时间: 2014- ...

  8. Linux安装telnet

    安装环境:CentOS 6.4    上篇已经讲述了memcached的安装,现在要测试Memcached功能的时候,需要使用到telnet服务.于是就有了本篇.   一.安装telnet 1.检测t ...

  9. request模块提交数据

    http://ctf8.shiyanbar.com/jia/ #coding:utf-8import re,requestsurl = r"http://ctf8.shiyanbar.com ...

  10. 注解与反射 ---Spring与Mybatis等框架的实现原理

    Java中各大框架,无论是AOP 还是 IoC 其基本实现思路都是源自Java 运行时支撑的反射功能, 而反射最基本的一点就是 任何一个类 其在JVM环境中,都有一个对象的Class对象,这个对象提供 ...