写在前面


这几天,一直都在学习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

  1. using System;
  2. using System.ComponentModel;
  3. using System.ComponentModel.DataAnnotations;
  4. using System.ComponentModel.DataAnnotations.Schema;
  5. namespace myEFCodeFirst_03
  6. {
  7. public class movie
  8. {
  9. [Description("主键")]
  10. [Key]
  11. [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  12. public int Id { get; set; }
  13. [Description("电影名称")]
  14. public string Title { get; set; }
  15. [Description("日期")]
  16. public DateTime ReleaseDate { get; set; }
  17. [Description("类型")]
  18. public string Genre { get; set; }
  19. [Description("价格")]
  20. public decimal Price { get; set; }
  21. }
  22. }

【2】创建DatabaseContext上下文

  • 需要引用** using System.Data.Entity**
  1. using System.Data.Entity;
  2. namespace myEFCodeFirst_03
  3. {
  4. //
  5. [DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
  6. public class DataBaseContext:DbContext
  7. {
  8. public DataBaseContext() : base("name=myCodeFirstConn") { }
  9. public DbSet<movie> movies { get; set; }
  10. }
  11. }

五、连接字符串

  • 打开App.config 创建 ConnectionStrings
  1. <connectionStrings>
  2. <add name="myCodeFirstConn" connectionString="Data Source=localhost;user id=root;Password=root;database=myCodeFirstDb;port=3306;"providerName="MySql.Data.MySqlClient"/>
  3. </connectionStrings>
  4. <entityFramework>
  5. <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
  6. <parameters>
  7. <parameter value="mssqllocaldb" />
  8. </parameters>
  9. </defaultConnectionFactory>
  10. <providers>
  11. <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.10.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"/>
  12. </providers>
  13. </entityFramework>

六、编辑程序

  • Program声明上下文实例
  1. using System;
  2. using System.Collections.Generic;
  3. namespace myEFCodeFirst_03
  4. {
  5. class Program
  6. {
  7. static void Main(string[] args)
  8. {
  9. //声明上下文依赖
  10. DataBaseContext _db = new DataBaseContext();
  11. //声明movie类
  12. List<movie> lstmovie = new List<movie> {
  13. new movie{ Title="速度与激情系列1",Genre="动作",ReleaseDate=DateTime.Now,Price=50 },
  14. new movie{ Title="速度与激情系列2",Genre="动作",ReleaseDate=DateTime.Now,Price=50 },
  15. new movie{ Title="速度与激情系列3",Genre="动作",ReleaseDate=DateTime.Now,Price=50 },
  16. new movie{ Title="速度与激情系列4",Genre="动作",ReleaseDate=DateTime.Now,Price=50 },
  17. new movie{ Title="速度与激情系列5",Genre="动作",ReleaseDate=DateTime.Now,Price=50 },
  18. new movie{ Title="速度与激情系列6",Genre="动作",ReleaseDate=DateTime.Now,Price=50 },
  19. new movie{ Title="速度与激情系列7",Genre="动作",ReleaseDate=DateTime.Now,Price=50 },
  20. new movie{ Title="速度与激情系列8",Genre="动作",ReleaseDate=DateTime.Now,Price=50 },
  21. };
  22. _db.movies.AddRange(lstmovie);
  23. if (_db.SaveChanges() > 0) { Console.WriteLine("添加成功"); Console.ReadKey(); }
  24. else { Console.WriteLine("添加失败");Console.ReadKey(); }
  25. }
  26. }
  27. }

运行项目,程序台显示添加成功代表数据已经成功添加到数据库。如图所示:

我们到MySQL数据库查看一下。如图所示:

七、数据迁移

我们在开发的过程中常常会遇到表结构发生了变化,比如要在原来的表结构上新增或者删除一个字段。

我们该如何在不影响原有结构和有数据的情况下通过Code Frist 的方式同步更新数据库呢?

为了完整的演示这个过程,我把原来的表以及数据删除。使用Code First 实现数据的迁移。

【1】使用命令初始化数据并更新数据库

  • 在工具->NuGet 包管理器->程序包管理控制台 输入

  • 首先输入: Enable-Migrations

  • 我们会看到在项目中会Migrations的文件夹 如下图所示:

  • Migrations的文件夹生成Configuration配置类
  1. namespace myEFCodeFirst_03.Migrations
  2. {
  3. using System;
  4. using System.Data.Entity;
  5. using System.Data.Entity.Migrations;
  6. using System.Linq;
  7. internal sealed class Configuration : DbMigrationsConfiguration<myEFCodeFirst_03.DataBaseContext>
  8. {
  9. public Configuration()
  10. {
  11. AutomaticMigrationsEnabled = false;
  12. }
  13. protected override void Seed(myEFCodeFirst_03.DataBaseContext context)
  14. {
  15. // This method will be called after migrating to the latest version.
  16. // You can use the DbSet<T>.AddOrUpdate() helper extension method
  17. // to avoid creating duplicate seed data.
  18. }
  19. }
  20. }

我们把AutomaticMigrationsEnabled的属性改成true

  • 然后输入:Add-Migration Initial 初始化数据 生成Migrations的文件夹生成201908280742145_Initials初始化类 如下图:

201908280742145_Initials初始化数据类如下:

  1. namespace myEFCodeFirst_03.Migrations
  2. {
  3. using System;
  4. using System.Data.Entity.Migrations;
  5. public partial class Initials : DbMigration
  6. {
  7. public override void Up()
  8. {
  9. CreateTable(
  10. "dbo.movie",
  11. c => new
  12. {
  13. Id = c.Int(nullable: false, identity: true),
  14. Title = c.String(unicode: false),
  15. ReleaseDate = c.DateTime(nullable: false, precision: 0),
  16. Genre = c.String(unicode: false),
  17. Price = c.Decimal(nullable: false, precision: 18, scale: 2),
  18. MovieDes = c.String(unicode: false),
  19. })
  20. .PrimaryKey(t => t.Id);
  21. }
  22. public override void Down()
  23. {
  24. DropTable("dbo.movie");
  25. }
  26. }
  27. }
  • 最后输入:Update-Database 更新数据库 如下图所示:

  • 我们刷新一下数据库,就可以看到MySql数据库创建了movie

【2】新增字段

  • 然后启动程序添加数据,并在Movie类中添加电影评价的字段
  1. using System;
  2. using System.ComponentModel;
  3. using System.ComponentModel.DataAnnotations;
  4. using System.ComponentModel.DataAnnotations.Schema;
  5. namespace myEFCodeFirst_03
  6. {
  7. public class movie
  8. {
  9. [Description("主键")]
  10. [Key]
  11. [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  12. public int Id { get; set; }
  13. [Description("电影名称")]
  14. public string Title { get; set; }
  15. [Description("日期")]
  16. public DateTime ReleaseDate { get; set; }
  17. [Description("类型")]
  18. public string Genre { get; set; }
  19. [Description("价格")]
  20. public decimal Price { get; set; }
  21. [Description("电影描述")]
  22. public string MovieDes { get; set; }
  23. //新增
  24. [Description("电影评价")]
  25. public string MovieEvaluates{ get; set; }
  26. }
  27. }

使用命令 更改数据库结构 add-Migration AddColunm

生成201908280759301_AddColunm 类,记录表结构发生表化

  1. namespace myEFCodeFirst_03.Migrations
  2. {
  3. using System;
  4. using System.Data.Entity.Migrations;
  5. public partial class AddColunm : DbMigration
  6. {
  7. public override void Up()
  8. {
  9. AddColumn("dbo.movie", "MovieEvaluates", c => c.String(unicode: false));
  10. }
  11. public override void Down()
  12. {
  13. DropColumn("dbo.movie", "MovieEvaluates");
  14. }
  15. }
  16. }

输入 update-database 如下图:

  • 最后,刷新数据库。我们就会看到在在movie表中在数据的情况下,添加了MovieEvaluates列。如下图更新前后的对比:

【3】删除字段

  • 删除字段,亦然如此操作。

写在最后

至此,完成了通过Code First 方式的的使用以及实现MySql 的数据迁移。

Entity Framework 学习系列(3) - MySql Code First 开发方式+数据迁移的更多相关文章

  1. Entity Framework 学习系列(2) - MySql Database First 开发方式

    目录 写在前面 环境 下载MySQL连接工具 创建Databse First 1.创建控制台 2.创建数据库 3.安装 MySQL.Data 和MySQL.Data.Entity 3.在项目中添加数据 ...

  2. Entity Framework 学习系列(4) - EF 增删改

    目录 写在前面 一.开发环境 二.创建项目 三.新增 1.单表新增 2.批量新增 3.多表新增 四.编辑 1.先查询,后编辑 2.创建实体,后编辑 五.删除 写在前面 在上一小节中,学习了如何 通过C ...

  3. Entity Framework 学习系列(1) - 认识理解Entity Framework

    目录 写在前面 什么是Entity Framework EF的优缺点 1.优点 2.缺点 如何理解ORM EF执行的原理 写在前面 在使用.net mvc 开发的时候.为了高效的开发,我们常常会搭配O ...

  4. Entity Framework 学习系列(5) - EF 相关查询

    目录 写在前面 一.使用Stopwatch 查询执行效率 二.简单查询 1.Linq写法: 2.Lambda表达式写法: 三.条件查询 1.Linq 写法 2.lambda 写法 四.聚合函数 1.L ...

  5. Entity Framework入门系列(1)-扯淡开篇

    这是我在Cnblogs上的第一个系列,但愿能坚持下去: 惯例索引 Entity Framework入门系列(1)-开篇兼索引: Entity Framework入门系列(2)-初试Code First ...

  6. MVC5 Entity Framework学习

    MVC5 Entity Framework学习(1):创建Entity Framework数据模型 MVC5 Entity Framework学习(2):实现基本的CRUD功能 MVC5 Entity ...

  7. 13本热门书籍免费送!(Python、SpingBoot、Entity Framework、Ionic、MySQL、深度学习、小程序开发等)

    七月第一周,网易云社区联合清华大学出版社为大家送出13本数据分析以及移动开发的书籍(Python.SpingBoot.Entity Framework.Ionic.MySQL.深度学习.小程序开发等) ...

  8. Entity Framework 学习整理(分播客整理)

    MSDN: http://msdn.microsoft.com/en-us/data/aa937723 台湾博客: http://www.dotblogs.com.tw/yc421206/ http: ...

  9. Entity Framework 学习整理

    MSDN: http://msdn.microsoft.com/en-us/data/aa937723 台湾博客: http://www.dotblogs.com.tw/yc421206/ http: ...

随机推荐

  1. Lua语法要点2

    [Lua语法要点2] 1.Lua函数 function 可以添加 local 关键字.添加后为局部函数,不添加(默认)为全局函数.return 可以返回多个返回值,以, 分隔. 使用 ... 来表示变 ...

  2. 逆向破解之160个CrackMe —— 027

    CrackMe —— 027 160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序 CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 c ...

  3. 数据结构 - 链栈的实现 C++

    链栈封装 C++ 使用C++对链栈进行了简单的封装,实现了栈的基本操作 封装方法: pop(),top(),size(),empty(),push() 代码已经过测试 #pragma once #in ...

  4. nginx 其他配置语法

    1.nginx 缓冲区配置 2.跳转重定向 3.头信息 4.超时 location / { proxy_pass http://127.0.0.1:8080;(代理跳转url) proxy_redir ...

  5. 08-numpy-笔记-sum

    求和: axis = 0 按列求和 axis = 1 按行求和 >>> import numpy as np >>> a = np.mat([[1,2,3],[4, ...

  6. JS 中的 new 操作符

    按照javascript语言精粹中所说,如果在一个函数前面带上new来调用该函数,那么将创建一个隐藏连接到该函数的prototype成员的新对象,同时this将被绑定到那个新对象上.这个话很抽象,我想 ...

  7. Andriod Studio安装及使用

    创建Andriod项目 1.下载最新版的Andriod studio 2.在 Welcome to Android Studio 窗口中,点击 Start a new Android Studio p ...

  8. css 布局 一中一右

    .container { position: relative; .my-center { text-align: center; line-height: 30rpx; min-width: 400 ...

  9. Hibernate框架学习3

    一对多|多对一 一对多 多对一 级联操作 结论: 简化操作.一定要用,save-update,不建议使用delete. 关系维护 在保存时.两方都会维护外键关系.关系维护两次,冗余了. 多余的维护关系 ...

  10. MYSQL:基于哈希的索引和基于树的索引有什么区别?

    B+树是一个平衡的多叉树.B+树从根节点到叶子节点的搜索效率基本相当,不会出现大幅波动. 哈希索引采用一定的哈希算法,把键值换成新的哈希值,检索时不需要类似B+树那样从根节点逐级查找,只需一次哈希算法 ...