Entity Framework(数据的迁移)

Category类中添加一个Grade 属性

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ClassLibrary.Models
{
    /// <summary>
    /// 产品分类表
    /// </summary>
    public class Category
    {
        /// <summary>
        /// 分类ID
        /// </summary>
        public int CategoryId { get; set; }

        /// <summary>
        /// 分类名称
        /// </summary>
        public string CategoryName { get; set; }

        public string Grade { get; set; }

        /// <summary>
        /// 产品
        /// </summary>
        public List<Product> ProductList { get; set; }
    }
}

Product

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ClassLibrary.Models
{
    /// <summary>
    /// 产品类
    /// </summary>
    public class Product
    {
        /// <summary>
        /// 产品Id
        /// </summary>
        public int Id { get; set; }

        /// <summary>
        /// 产品名称
        /// </summary>
        public string ProductName { get; set; }

        /// <summary>
        /// 产品价格
        /// </summary>
        public decimal Price { get; set; }

        /// <summary>
        /// 出版日期
        /// </summary>
        public DateTime PublicDate { get; set; }

    }
}

Context引用上下文:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Entity;
using ClassLibrary.Models;
using System.Threading.Tasks;

namespace ClassLibrary.EFDbContext
{
    public class Context : DbContext
    {
        /// <summary>
        /// 1、创建构造函数,构造函数继承DbContext类的构造函数,通过DbContext类的构造函数创建数据库连接
        /// 2、DbContext类的构造函数里面的参数是数据库连接字符串,通过该连接字符串去创建数据库
        /// </summary>
        public Context()
            : base("name=CodeFirstApp")
        { }

        //2、定义数据集合:用于创建表
        public DbSet<Category> Categorys { get; set; }

        public DbSet<Product> Products { get; set; }
    }
}

要在App.config和添加数据的中的App.config 添加

<connectionStrings>
             <add name="CodeFirstApp" connectionString="Data Source=.;Initial Catalog=CodeFirstApp;Integrated Security=True" providerName="System.Data.SqlClient"/>
    </connectionStrings>
name="CodeFirstApp"中的CodeFirstApp是与Context中base("name=CodeFirstApp")的CodeFirstApp对应
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ClassLibrary.EFDbContext;
using ClassLibrary.Models;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var context = new Context())
            {
                //创建数据库  如果数据库不存在,则调用EF内置的API创建数据库
                if (context.Database.CreateIfNotExists())
                {
                    Console.WriteLine("数据库创建成功!");
                }
                else
                {
                    Console.WriteLine("数据库已存在");
                }
                //添加数据
                var cate = new List<Category> {
                   new Category{
                    CategoryName="文学类",
                    Grade="15",
                    ProductList=new List<Product>{
                          new Product
                   {
                     ProductName="百年孤独",
                     Price=37.53m,
                     PublicDate=new DateTime(2011,6,1)

                   },
                     new Product
                   {
                     ProductName="老人与海",
                     Price=37.53m,
                     PublicDate=new DateTime(2010,6,1)

                   }
                      }
                   },
                    new Category{
                    CategoryName="计算机类",
                    Grade="20",
                    ProductList=new List<Product>{
                          new Product
                   {
                    ProductName="C#高级编程第九版",
                     Price=48.23m,
                     PublicDate=new DateTime(2016,2,8)
                   },
                    new Product
                   {
                     ProductName="Oracle从入门到精通",
                     Price=27.03m,
                     PublicDate=new DateTime(2014,7,9)
                   }
                      }
                   }

                };

                //将创建的集合添加到上下文中
                context.Categorys.AddRange(cate);
                //调用SaveChanges()方法,将数据插入到数据库
                if (context.SaveChanges() > 0) {
                    Console.WriteLine("添加成功");
                } 

                Console.ReadKey();
            }
        }
    }
}

 启用数据迁移:

1、打开迁移

【程序包控制台】:在【工具】——>【GuGet包管理工具】——>【程序包管理控制台】

在程序包管理器控制台中输入:Enable-Migrations

 按回车键后,会生成Migrations文件夹,以及Migrations文件夹下面的Configuration类和201711281316287_InitialCreate类:

 

Configuration:这个类允许你去配置如何迁移,对于本文将使用默认的配置(在本文中因为只有一个Context,Enable-Migrations将自动对context type作出适配);

201711281316287_InitialCreate:这个迁移之所以存在是因为我们之前用Code First创建了数据库,在启用迁移之前,scaffolded migration里面的代码表示在数据库中已经创建的对象,本文中即为表Students。

Code First Migrations有两个需要熟悉的命令:
Add-Migration 将scaffold创建下一次基于上一次迁移以来的更改的迁移;
Update-Database 将任何挂起的迁移应用到数据库;

以上面新增加的字段Grade属性为例,命令Add-Migration允许我们对迁移进行命名,我们把迁移命名为AddGrade。

2、增加迁移节点

在程序包管理器控制台中输入命令:Add-Migration AddGrade

 一个新的迁移(201711281402492_AddGrade)在目录Migrations中创建成功:

 201711281402492_AddGrade类结构如下:

namespace EF.FluentAPI.Migrations
{
    using System;
    using System.Data.Entity.Migrations;

    public partial class AddGrade : DbMigration
    {
        public override void Up()
        {
            AddColumn("dbo.Students", "Grade", c => c.String(nullable: false, maxLength: 16, unicode: false));
        }

        public override void Down()
        {
            DropColumn("dbo.Students", "Grade");
        }
    }
}

201711281402492_AddGrade的名称是上面Add后面定义的迁移名称,而类下面有两个方法:一个是Up,一个是Down,记录了需要升级的修改,这里也就是Students表增加了Grade列。只要我们在后面执行Update-Database,就会执行此类下面的Up函数。

这里的Down函数简单介绍就是:为了回滚修改而设计的。如果用户希望恢复到某一个迁移节点,程序会自动根据已经执行的迁移,判断回滚哪些迁移,执行他们的Down函数。

3、更新数据库

在程序包管理器控制台中输入命令:Update-Database -Verbose

 查看数据库,Students表已经增加Grade字段:

 到此为止,迁移已经完成。(对表的的修改都可以通过迁移来改变数据库哦)

posted @ 2021-12-09 17:25  裳裳者华  阅读(89)  评论(0编辑  收藏  举报