当前位置: 首页 > news >正文

EF实体框架之CodeFirst八

前面七篇基本把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="001", 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

相关文章:

  • checkbox功能实现之全选、反选、取消
  • mybatis generator Date类型时间丢失
  • 预防AD对象意外删除--启用ADRecycleBin
  • ftl 列表弄成js数组
  • Spring配置hibernate读取实体类映射mappingResources,annotatedClasses,packagesToScan
  • md5sum 生成 经md5加密后的字符串
  • 七牛云:ckeditor JS SDK 结合 C#实现多图片上传。
  • Linux之进程管理(1)基本介绍
  • HTML元素坐标定位,这些知识点得掌握
  • C#抽象类与抽象方法--就是类里面定义了函数而函数里面什么都没有做的类
  • Oracle 一次 锁表 处理小记
  • Apache所有项目介绍
  • 太吃鸡了
  • 51 nod 1681 公共祖先 (主席树+dfs序)
  • 环境搭建中项目源码地址(零)
  • angular组件开发
  • input的行数自动增减
  • javascript面向对象之创建对象
  • Java反射-动态类加载和重新加载
  • nginx 配置多 域名 + 多 https
  • opencv python Meanshift 和 Camshift
  • PHP 7 修改了什么呢 -- 2
  • React Transition Group -- Transition 组件
  • Tornado学习笔记(1)
  • uni-app项目数字滚动
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 解决iview多表头动态更改列元素发生的错误
  • 聚簇索引和非聚簇索引
  • 前端技术周刊 2019-02-11 Serverless
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 怎样选择前端框架
  • 做一名精致的JavaScripter 01:JavaScript简介
  • MyCAT水平分库
  • ​渐进式Web应用PWA的未来
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #mysql 8.0 踩坑日记
  • #QT项目实战(天气预报)
  • (1)(1.13) SiK无线电高级配置(五)
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (转)http协议
  • (转)创业的注意事项
  • (转)原始图像数据和PDF中的图像数据
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • **CI中自动类加载的用法总结
  • *1 计算机基础和操作系统基础及几大协议
  • .apk文件,IIS不支持下载解决
  • .bat文件调用java类的main方法
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .Net Core 中间件验签
  • .net 提取注释生成API文档 帮助文档
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • /etc/sudoer文件配置简析
  • []新浪博客如何插入代码(其他博客应该也可以)
  • [④ADRV902x]: Digital Filter Configuration(发射端)