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

时间: 2024-11-03 21:58:33

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

EF实体框架之CodeFirst一

对于SQL Server.MySql.Oracle等这些传统的数据库,基本都是关系型数据库,都是体现实体与实体之间的联系,在以前开发时,可能先根据需求设计数据库,然后在写Model和业务逻辑,对于Model类基本都是和表的字段对应着,而表中存的每条记录又和类的实例对象对应着,有了这个对照关系,就是能不能只在一边设计,在数据库设计表或在VS中设计Model,然后直接生成另一边,这样就省了好多时间成本.于是有了ORM,Object Relation Mapping,对象关系映射.既然可以根据Mode

EF实体框架之CodeFirst七

前面的6篇博客基本把Code First学习的差不多了,今天这篇学习下code first中的并发控制和事务,基本也快学完了,顶多就差数据迁移. 在数据库中也是有锁和事务的概念,在C#中也是存在,当然code first也是必要要有的.对于什么是并发.什么是锁和事务,它们的特性是什么这些概念性的就不一一列举.因为这些要是发散的学习就涉及到好多的知识点.并发能联想到多线程,多线程能联想到同步异步,同步异步操作系统,等等.知识都是连贯着的.有了并发那就有不并发的情况,想让不并发,那用什么呢?那就要用

EF实体框架之CodeFirst六

上午的时候把复杂类型学习了一下,想着趁着周六日把Code First学习完,所以下午还是把Code First中的关系学习下.在数据库中最重要的恐怕就是E-R图了,E-R体现了表与表直接的关系.使用Code First也需要把这种表与表直接的关系映射到数据库中,所以关系映射在Code First中也是很重要的一节.Code First中主要包括一对一.一对多.多对多.自反关系. 一.外键列名默认约定 Entity Framework Code First在根据默认约定创建外键时,外键列的名称存在

EF实体框架创建方法

EF实体框架创建方法: 1.添加EF框架: 在工程中,先添加文件夹:DataModel(方便管理),在文件夹中再添加新项:数据--ADO.Net实体数据模型: 命名为: DataModel.edmx.并勾选“确定对象名称的单复数形式”(会创建集合和项的名称区别). 2.数据模型文件说明: DataModel.edmx:生成的数据模型文件包.DataModel.Context.cs:包括模型中,所有表集合的管理类.DataModel.tt子节点下的文件:表数据类的定义(映射). 3.问题: 1.生

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

当前位置: 主页 > 编程开发 > C_VC视频教程 > C#.Net EF实体框架入门视频教程 > kingstone金士顿手机内存卡16G仅65元 1.EF实体框架之增加查询 上传日期:2014-09-14 18:48:21  相关摘要:  - 破解无线路由器密码需要增加那些设备? - 桌面上的东西删除的话就会出现文件正在删除的图标,但是这个图标永远不消失 - sql语句查询一张表的3-6条数据,6-9条数据,这样的sql这么写呢 2.EF修改删除和延时加载 上传日期:2014

EF实体框架数据操作基类(转)

//----------------------------------------------------------------// Copyright (C) 2013 河南禄恒软件科技有限公司// // 功能描述:实体框架数据仓储的操作接口,包含增删改查接口////----------------------------------------------------------------using System;using System.Data.Entity.Infrastruct

EF实体框架数据操作接口(转)

//----------------------------------------------------------------// Copyright (C) 2013 河南禄恒软件科技有限公司// // 功能描述:实体框架数据仓储的操作接口,包含增删改查接口////----------------------------------------------------------------using System;using System.Linq;using System.Linq.

EF实体框架数据操作接口

//----------------------------------------------------------------// Copyright (C) 2013 河南禄恒软件科技有限公司// // 功能描述:实体框架数据仓储的操作接口,包含增删改查接口////----------------------------------------------------------------using System;using System.Linq;using System.Linq.

EF实体框架数据操作基类

//----------------------------------------------------------------// Copyright (C) 2013 河南禄恒软件科技有限公司// // 功能描述:实体框架数据仓储的操作接口,包含增删改查接口////----------------------------------------------------------------using System;using System.Data.Entity.Infrastruct