Entity Framework 学习系列(3) - MySql Code First 开发方式+数据迁移
写在前面
这几天,一直都在学习Entity Framework 的Code First 开发模式。然后,一直在填坑的路上渐行渐远又因为平时工作的原因,对于EF的学习时断时续的
今天,使用程序台应用的方式来使用EF的Code First 的开发模式。本来是想使用Web Mvc 的方式使用Code First,后来发现,在Visual Studio 2019中使用
EF Code First连接MySQL的时候连控制器的创建不了。尝试了很多的方法,最后还是出现了如图所示的错误:
报错
运行所选代码生成器时出错:“值-1超出了可接受的[0,2147483647]范围。参数名称:value”
最后,去问了度娘。大部分的人都是在说这个是Visual Studio 2019的一个Bug。然后,我又尝试了使用.Net Core Web Mvc +EF Code First 的方式创建项目
自此就没有出现如上图所示的问题。
一、开发环境
开发工具:Visual Studio 2019
开发环境:Win 10 家庭版
开发数据库: MySql 8.0.17
ORM框架:Entity Framework 6.2.0
二、创建项目
【1】打开Visual Studio 2019-->创建新项目-->控制台应用
【2】项目名称myEFCodeFirst 选择存放的位置 点击创建
三、安装程序包
【1】项目->NuGet包管理->管理解决方案的NuGet 程序包->浏览->搜索Entity Framework 安装 EntityFramework 6.2.0勾选项目 点击安装
【2】在浏览->搜索MySql.Data 安装MySql.Data 6.10.9版本
【3】浏览->搜索MySql.Data.Entity 安装MySql.Data.Entity 6.10.9 版本
【4】打开引用,查看引用。如下图所示的引用表示安装成功。
四、创建模型
【1】创建Movie类
using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace myEFCodeFirst_03
{
public class movie
{
[Description("主键")]
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Description("电影名称")]
public string Title { get; set; }
[Description("日期")]
public DateTime ReleaseDate { get; set; }
[Description("类型")]
public string Genre { get; set; }
[Description("价格")]
public decimal Price { get; set; }
}
}
【2】创建DatabaseContext
上下文
- 需要引用** using System.Data.Entity**
using System.Data.Entity;
namespace myEFCodeFirst_03
{
//
[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
public class DataBaseContext:DbContext
{
public DataBaseContext() : base("name=myCodeFirstConn") { }
public DbSet<movie> movies { get; set; }
}
}
五、连接字符串
- 打开App.config 创建 ConnectionStrings
<connectionStrings>
<add name="myCodeFirstConn" connectionString="Data Source=localhost;user id=root;Password=root;database=myCodeFirstDb;port=3306;"providerName="MySql.Data.MySqlClient"/>
</connectionStrings>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="mssqllocaldb" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.10.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"/>
</providers>
</entityFramework>
六、编辑程序
- 在Program声明上下文实例
using System;
using System.Collections.Generic;
namespace myEFCodeFirst_03
{
class Program
{
static void Main(string[] args)
{
//声明上下文依赖
DataBaseContext _db = new DataBaseContext();
//声明movie类
List<movie> lstmovie = new List<movie> {
new movie{ Title="速度与激情系列1",Genre="动作",ReleaseDate=DateTime.Now,Price=50 },
new movie{ Title="速度与激情系列2",Genre="动作",ReleaseDate=DateTime.Now,Price=50 },
new movie{ Title="速度与激情系列3",Genre="动作",ReleaseDate=DateTime.Now,Price=50 },
new movie{ Title="速度与激情系列4",Genre="动作",ReleaseDate=DateTime.Now,Price=50 },
new movie{ Title="速度与激情系列5",Genre="动作",ReleaseDate=DateTime.Now,Price=50 },
new movie{ Title="速度与激情系列6",Genre="动作",ReleaseDate=DateTime.Now,Price=50 },
new movie{ Title="速度与激情系列7",Genre="动作",ReleaseDate=DateTime.Now,Price=50 },
new movie{ Title="速度与激情系列8",Genre="动作",ReleaseDate=DateTime.Now,Price=50 },
};
_db.movies.AddRange(lstmovie);
if (_db.SaveChanges() > 0) { Console.WriteLine("添加成功"); Console.ReadKey(); }
else { Console.WriteLine("添加失败");Console.ReadKey(); }
}
}
}
运行项目,程序台显示添加成功代表数据已经成功添加到数据库。如图所示:
我们到MySQL数据库查看一下。如图所示:
七、数据迁移
我们在开发的过程中常常会遇到表结构发生了变化,比如要在原来的表结构上新增或者删除一个字段。
我们该如何在不影响原有结构和有数据的情况下通过Code Frist 的方式同步更新数据库呢?
为了完整的演示这个过程,我把原来的表以及数据删除。使用Code First 实现数据的迁移。
【1】使用命令初始化数据并更新数据库
在工具->NuGet 包管理器->程序包管理控制台 输入
首先输入:
Enable-Migrations
我们会看到在项目中会Migrations的文件夹 如下图所示:
- 在Migrations的文件夹生成Configuration配置类
namespace myEFCodeFirst_03.Migrations
{
using System;
using System.Data.Entity;
using System.Data.Entity.Migrations;
using System.Linq;
internal sealed class Configuration : DbMigrationsConfiguration<myEFCodeFirst_03.DataBaseContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
}
protected override void Seed(myEFCodeFirst_03.DataBaseContext 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.
}
}
}
我们把AutomaticMigrationsEnabled的属性改成true
- 然后输入:
Add-Migration Initial
初始化数据 生成Migrations的文件夹生成201908280742145_Initials初始化类 如下图:
201908280742145_Initials初始化数据类如下:
namespace myEFCodeFirst_03.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class Initials : DbMigration
{
public override void Up()
{
CreateTable(
"dbo.movie",
c => new
{
Id = c.Int(nullable: false, identity: true),
Title = c.String(unicode: false),
ReleaseDate = c.DateTime(nullable: false, precision: 0),
Genre = c.String(unicode: false),
Price = c.Decimal(nullable: false, precision: 18, scale: 2),
MovieDes = c.String(unicode: false),
})
.PrimaryKey(t => t.Id);
}
public override void Down()
{
DropTable("dbo.movie");
}
}
}
- 最后输入:
Update-Database
更新数据库 如下图所示:
- 我们刷新一下数据库,就可以看到MySql数据库创建了movie类
【2】新增字段
- 然后启动程序添加数据,并在Movie类中添加电影评价的字段
using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace myEFCodeFirst_03
{
public class movie
{
[Description("主键")]
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Description("电影名称")]
public string Title { get; set; }
[Description("日期")]
public DateTime ReleaseDate { get; set; }
[Description("类型")]
public string Genre { get; set; }
[Description("价格")]
public decimal Price { get; set; }
[Description("电影描述")]
public string MovieDes { get; set; }
//新增
[Description("电影评价")]
public string MovieEvaluates{ get; set; }
}
}
使用命令 更改数据库结构 add-Migration AddColunm
生成201908280759301_AddColunm
类,记录表结构发生表化
namespace myEFCodeFirst_03.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class AddColunm : DbMigration
{
public override void Up()
{
AddColumn("dbo.movie", "MovieEvaluates", c => c.String(unicode: false));
}
public override void Down()
{
DropColumn("dbo.movie", "MovieEvaluates");
}
}
}
输入 update-database
如下图:
- 最后,刷新数据库。我们就会看到在在movie表中在数据的情况下,添加了MovieEvaluates列。如下图更新前后的对比:
【3】删除字段
- 删除字段,亦然如此操作。
写在最后
至此,完成了通过Code First 方式的的使用以及实现MySql 的数据迁移。
Entity Framework 学习系列(3) - MySql Code First 开发方式+数据迁移的更多相关文章
- Entity Framework 学习系列(2) - MySql Database First 开发方式
目录 写在前面 环境 下载MySQL连接工具 创建Databse First 1.创建控制台 2.创建数据库 3.安装 MySQL.Data 和MySQL.Data.Entity 3.在项目中添加数据 ...
- Entity Framework 学习系列(4) - EF 增删改
目录 写在前面 一.开发环境 二.创建项目 三.新增 1.单表新增 2.批量新增 3.多表新增 四.编辑 1.先查询,后编辑 2.创建实体,后编辑 五.删除 写在前面 在上一小节中,学习了如何 通过C ...
- Entity Framework 学习系列(1) - 认识理解Entity Framework
目录 写在前面 什么是Entity Framework EF的优缺点 1.优点 2.缺点 如何理解ORM EF执行的原理 写在前面 在使用.net mvc 开发的时候.为了高效的开发,我们常常会搭配O ...
- Entity Framework 学习系列(5) - EF 相关查询
目录 写在前面 一.使用Stopwatch 查询执行效率 二.简单查询 1.Linq写法: 2.Lambda表达式写法: 三.条件查询 1.Linq 写法 2.lambda 写法 四.聚合函数 1.L ...
- Entity Framework入门系列(1)-扯淡开篇
这是我在Cnblogs上的第一个系列,但愿能坚持下去: 惯例索引 Entity Framework入门系列(1)-开篇兼索引: Entity Framework入门系列(2)-初试Code First ...
- MVC5 Entity Framework学习
MVC5 Entity Framework学习(1):创建Entity Framework数据模型 MVC5 Entity Framework学习(2):实现基本的CRUD功能 MVC5 Entity ...
- 13本热门书籍免费送!(Python、SpingBoot、Entity Framework、Ionic、MySQL、深度学习、小程序开发等)
七月第一周,网易云社区联合清华大学出版社为大家送出13本数据分析以及移动开发的书籍(Python.SpingBoot.Entity Framework.Ionic.MySQL.深度学习.小程序开发等) ...
- Entity Framework 学习整理(分播客整理)
MSDN: http://msdn.microsoft.com/en-us/data/aa937723 台湾博客: http://www.dotblogs.com.tw/yc421206/ http: ...
- Entity Framework 学习整理
MSDN: http://msdn.microsoft.com/en-us/data/aa937723 台湾博客: http://www.dotblogs.com.tw/yc421206/ http: ...
随机推荐
- Memcache内存缓存框架
转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10923221.html 一:Memcache是什么,为什么要用它 MemCache是一个高性能.“分布式”的 ...
- Odoo甘特图
转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826366.html 甘特图(注意:社区版不支持甘特图!所以不会显示) 水平条状的甘特图通常用于显示项目计 ...
- 从零开始写Hystrix
1.springboot+自定义注解实现灵活的切面配置 利用aop我们可以实现业务代码与系统级服务例如日志记录.事务及安全相关业务的解耦,使我们的业务代码更加干净整洁. 首先创建一个springboo ...
- 第02节-BLE协议各层的形象化理解
本篇博客根据韦大仙视频,整理所得. 先上框图: ATT层 从ATT开始看,在上篇博客讲的医院结构里面有个检验室,检验室可以得到各项结果,但是它并不知道这些结果代表什么含义.类比的在BLE协议栈里面,A ...
- Latex使用过程中的一些总结
本文主要总结在使用Latex过程中遇到的一些问题及解决方案. 一:关于参考文献 1.如何在paper同一处用\cite命令同时引用多篇文献? 用\cite{bibtex1}\cite{bibtex2} ...
- 201871010131张兴盼《面向程序设计(java)》第四周学习总结
项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...
- acwing 算法面试、笔试题公开课整理记录
week1 Google KickStart 2019 A轮 讲解视频地址AcWing 549. 训练 tag: 排序 遍历 在线练习地址AcWing 550. 包裹 在线练习地址Ac ...
- 安装Vyos
Vyos是一个开源的网络操作系统,基于Debian,相对于ROS需要购买license,Vyos就更加开放的多. 下载Vyos wget http://vyos.hecint.com/iso/re ...
- maven jar包冲突的发现与解决[工具篇]
本文是我的第177篇文章. 关于jar冲突排查解决的问题,相信很多小伙伴也都知道有一些,无非就是两类:命令 or 工具. 命令方式比如: mvn dependency:tree 工具方式比如: Mav ...
- Pandas | 07 函数应用
要将自定义或其他库的函数应用于Pandas对象,有三个重要的方法,下面来讨论如何使用这些方法.使用适当的方法取决于函数应用于哪个层面(DataFrame,行或列或元素). 表合理函数应用:pipe() ...