系列文章:

EF-ModelFirst实现过程+数据库迁移     http://www.jianshu.com/p/2a53f318144d

EF-DBFirst实现过程    http://www.jianshu.com/p/eb84ec814926

建议学习路径 DBFirst->ModelFirst->CodeFirst

思路:通过代码编写实体和关联,编写上下文,根据实体和关联生成数据库。

EF-CodeFirst的优点

EF-CodeFirst相对于EF-ModelFirst和EF-DBFirst的有点在于,CodeFirst在数据库已经设计完成之后,能够较方便得再次对数据库进行更改(数据库迁移技术)。

关联

1.Database First是基于已存在的数据库,利用某些工具(如VS提供的EF设计器)创建实体类,数据库对象与实体类的匹配关系等,你也可以手动修改这些自动生成的代码及匹配文件。也就是从一个数据库开始,然后生成实体框架和相应代码。

2.Model First 是先利用某些工具(如VS的EF设计器)设计出可视化的实体数据模型及他们之间的关系,然后再根据这些实体、关系去生成数据库对象及相关代码文件。

3.Code First 这种方式需要先写一些代码,如实体对象,数据关系等,然后根据已有的代码描述,自动创建数据对象。但其实这种方法与Model First是非常类似的。我们自己写的代码,其实就是用代码表示实体模型,而Model First是用可视化的方式描述了实体模型。

EF-CodeFirst的具体实现过程(以17-3-2课后作业为对象分析)

Step1:按需求新建若干实体Entity

BaseEntity基类

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace EF_CodeFirst_17_3_2.Model

{

public class BaseEntity

{

public BaseEntity()

{

CreateTime = DateTime.Now;

UpdateTime = DateTime.Now;

}

///

/// 创建ID

///

public int ID { get; set; }

///

/// 创建人

///

public string CreateBy { get; set; }

///

/// 创建时间

///

public DateTime CreateTime { get; set; }

///

/// 更新人

///

public string UpdateBy { get; set; }

///

/// 更新时间

///

public DateTime UpdateTime { get; set; }

}

}

Classes班级实体

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace EF_CodeFirst_17_3_2.Model

{

public class Classes:BaseEntity

{

///

/// 班级编号

///

public int ClassNO { get; set; }

///

/// 班级名称

///

public string ClassName { get; set; }

///

/// 班主任ID

///

public int MentorID { get; set; }

///

/// 班主任名称

///

public virtual string MentorName { get; set; }

///

/// 一个班级有多名学生

///

public virtual List students { get; set; }

}

}

Course课程实体

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace EF_CodeFirst_17_3_2.Model

{

public class Course:BaseEntity

{

///

/// 课程编号

///

public int CourseNO { get; set; }

///

/// 课程名称

///

public string CourseName { get; set; }

///

/// 一个课程有多名学生

///

public virtual List students { get; set; }

///

/// 一门课程有多个教师

///

public virtual List Teachers { get; set; }

}

}

学校School实体

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace EF_CodeFirst_17_3_2.Model

{

public class School : BaseEntity

{

///

/// 学校编号

///

public int SchoolNO { get; set; }

///

/// 学校名称

///

public string SchoolName { get; set; }

///

/// 校长ID

///

public int HeadmasterID { get; set; }

///

/// 校长名称

///

public string HeadmasterName { get; set; }

///

/// 学校地址

///

public string Address_new { get; set; }

}

}

学生Student实体

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace EF_CodeFirst_17_3_2.Model

{

public class Student:BaseEntity

{

///

/// 学生编号

///

public int StudentNO { get; set; }

///

/// 学生名称

///

public string StudentName { get; set; }

///

/// 一个学生属于一个班级名称

///

public virtual Classes ClassName { get; set; }

///

/// 一个学生有多门课程

///

public virtual List Courses { get; set; }

}

}

教师Teacher实体

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace EF_CodeFirst_17_3_2.Model

{

public class Teacher:BaseEntity

{

///

/// 教师编号

///

public int TeacherNO { get; set; }

///

/// 教师名称

///

public string TeacherName { get; set; }

///

/// 一个教师有多门课程

///

public virtual List Courses { get; set; }

}

}

Step2:建立各个实体之间的关联

比如 1 对 *,* 对 *等。

在代码上体现为:比如学生与班级的关系是:* 对 1。

则在实体Student内,存在一个班级对象。

即: ///

/// 一个学生属于一个班级名称

///

public virtual Classes ClassName { get; set; }

而在Classes实体内,存在多个学生,即存在多个学生对象,所以我们用Lisk集合来保存这些对象。

即: /// 一个班级有多名学生

///

public virtual List students { get; set; }

注意设置virtual属性。

Step3:在项目中引用EntityFramework

在项目中引用EntityFramework的两种方式:

1.通过 工具 > Nuget包管理器 > 管理解决方案的Nuget程序包,搜索EntityFramework在进行安装就行。

2.通过 工具 > Nuget包管理器 > 程序包管理控制台,输入“Install-Package EntityFramework”,也能自动完成EntityFramework的安装。

注意:不能通过复制EntityFramework的dll文件到项目文件夹下再进行引用。

Step4:配置App.config

Step5:编写上下文

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Data.Entity;

using EF_CodeFirst_17_3_2.Model;

namespace EF_CodeFirst_17_3_2.EF

{

public class CodeFirstDBContext : DbContext

{

public CodeFirstDBContext() : base("name=DBConn")

{

this.Configuration.LazyLoadingEnabled = true;

}

static CodeFirstDBContext()

{

//一:数据库不存在时重新创建数据库[默认]

Database.SetInitializer(new CreateDatabaseIfNotExists());

//二:每次启动应用程序时创建数据库

//Database.SetInitializer(new DropCreateDatabaseAlways());

//三:策略三:模型更改时重新创建数据库

//Database.SetInitializer(new DropCreateDatabaseIfModelChanges());

//策略四:从不创建数据库

//Database.SetInitializer(null);

}

public virtual DbSet Classes { get; set; }

public virtual DbSet Course { get; set; }

public virtual DbSet School { get; set; }

public virtual DbSet Student { get; set; }

public virtual DbSet Teacher { get; set; }

}

}

到这里通过EF-CodeFirst构建的项目差不多完成了,运行之后数据库应该会新建一个你在App.config中配置的数据库以及所有的实体对应的表,以及中间表( * 对 * 关系会生成中间表 )。如果没有可能需要向数据库的某个表添加一条数据之后才会出来。

主程序:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using EF_CodeFirst_17_3_2.EF;

using EF_CodeFirst_17_3_2.Model;

namespace EF_CodeFirst_17_3_2

{

class Program

{

static void Main(string[] args)

{

#region 添加学校信息

//using (CodeFirstDBContext dbContext = new CodeFirstDBContext())

//{

//    School Ecjtu = new School();

//    Ecjtu.SchoolName = "华东交通大学";

//    Ecjtu.SchoolNO = 1;

//    Ecjtu.CreateBy = "Fnatic";

//    Ecjtu.HeadmasterID = 1;

//    Ecjtu.HeadmasterName = "罗玉峰";

//    Ecjtu.UpdateBy = "Fanatic";

//    dbContext.School.Add(Ecjtu);

//    dbContext.SaveChanges();

//}

#endregion

#region 添加课程信息

//using (CodeFirstDBContext dbContext = new CodeFirstDBContext())

//{

//    Course English = new Course();

//    English.CourseName = "英语";

//    English.CourseNO = 1;

//    English.CreateBy = "Fnatic";

//    English.UpdateBy = "Fanatic";

//    Course Math = new Course();

//    Math.CourseName = "数学";

//    Math.CourseNO = 2;

//    Math.CreateBy = "Fnatic";

//    Math.UpdateBy = "Fanatic";

//    dbContext.Course.Add(English);

//    dbContext.Course.Add(Math);

//    dbContext.SaveChanges();

//}

#endregion

#region 添加班级信息

//using (CodeFirstDBContext dbContext = new CodeFirstDBContext())

//{

//    Classes classA = new Classes();

//    classA.ClassName = "微创班";

//    classA.ClassNO = 1;

//    classA.CreateBy = "Fnatic";

//    classA.MentorID = 1;

//    classA.MentorName = "Mentor_A";

//    classA.UpdateBy = "Fanatic";

//    Classes classB = new Classes();

//    classB.ClassName = "卓越班";

//    classB.ClassNO = 2;

//    classB.CreateBy = "Fnatic";

//    classB.MentorID = 2;

//    classB.MentorName = "Mentor_B";

//    classB.UpdateBy = "Fanatic";

//    dbContext.Classes.Add(classA);

//    dbContext.Classes.Add(classB);

//    dbContext.SaveChanges();

//}

#endregion

#region 添加教师信息

//using (CodeFirstDBContext dbContext = new CodeFirstDBContext())

//{

//    Teacher T_A = new Teacher();

//    T_A.CreateBy = "Fnatic";

//    T_A.TeacherName = "Teacher_A";

//    T_A.UpdateBy = "Fanatic";

//    T_A.TeacherNO = 1;

//    dbContext.Teacher.Add(T_A);

//    dbContext.SaveChanges();

//}

#endregion

//Q:是向学生信息添加班级信息还是向班级信息添加学生信息

#region 添加学生信息并加入班级

//using (CodeFirstDBContext dbContext = new CodeFirstDBContext())

//{

//    for (int i = 1; i <= 32; i++)

//    {

//        Student stu = new Student();

//        stu.CreateBy = "Fnatic";

//        stu.StudentName = "Student" + "_" + i;

//        stu.StudentNO = i;

//        stu.UpdateBy = "Fanatic";

//        //获取班级

//        Classes classes = dbContext.Classes.FirstOrDefault(u => u.ID == 1);

//        stu.ClassName = classes;

//        dbContext.Student.Add(stu);

//        dbContext.SaveChanges();

//    }

//}

#endregion

#region 教师教授课程的设置

//using (CodeFirstDBContext dbContext = new CodeFirstDBContext())

//{

//    Teacher teacher = dbContext.Teacher.FirstOrDefault(u => u.ID == 1);

//    Course courseA = dbContext.Course.FirstOrDefault(u => u.ID == 1);

//    Course courseB=dbContext.Course.FirstOrDefault(u => u.ID == 2);

//    List course = new List();

//    course.Add(courseA);

//    course.Add(courseB);

//    teacher.Courses = course;

//    dbContext.SaveChanges();

//}

#endregion

#region 学生选课

//using (CodeFirstDBContext dbContext = new CodeFirstDBContext())

//{

//    Course courseA = dbContext.Course.FirstOrDefault(u => u.CourseNO == 1);

//    List course = new List();

//    course.Add(courseA);

//    for (int i = 1; i <= 32; i++)

//    {

//        Student student = dbContext.Student.FirstOrDefault(u => u.StudentNO == i);

//        student.Courses = course;

//    }

//    dbContext.SaveChanges();

//}

#endregion

#region 添加学校地址之后再次添加学校信息

using (CodeFirstDBContext dbContext = new CodeFirstDBContext())

{

//School Caida = new School();

//Caida.CreateBy = "Fnatic";

//Caida.HeadmasterID = 2;

//Caida.HeadmasterName="王乔";

//Caida.SchoolName = "江西财经大学";

//Caida.SchoolNO = 2;

//Caida.UpdateBy = "Fanatic";

//Caida.Address_new = "蛟桥镇";

//dbContext.School.Add(Caida);

School Ecjtu = dbContext.School.FirstOrDefault(u => u.SchoolNO == 1);

Ecjtu.Address_new = "江西省南昌市昌北双港东大街808号";

dbContext.SaveChanges();

}

#endregion

}

}

}

实体Entity做了更改的时候要做数据库迁移:

enable-Migrations -Force

Add-Migration demo

最后再次执行:Update-Database -Force

数据库会自动生成dbo.__MigrationHistory表来记录更新记录。

在项目下面也会自动生成Migrations文件夹,包括每一次的更新记录,以及Configuration。

关于项目内命名空间的问题:

1. 对于在项目根目录下:命名空间为项目名

2. 但是如果在项目下面新建了文件夹,则命名空间为“项目名.文件夹名”

所以在引用不用命名空间下的资源的时候需要首先引用命名空间。

更新:

时间:2017-03-17

codefirst在做数据库迁移的可能出现的错误:

欢迎指正O(∩_∩)O~

EF mysql 数据迁移_EF-CodeFirst实现过程+数据库迁移相关推荐

  1. EF mysql 数据迁移_EF Code First Migrations数据库迁移

    1.EF Code First创建数据库 新建控制台应用程序Portal,通过程序包管理器控制台添加EntityFramework. 在程序包管理器控制台中执行以下语句,安装EntityFramewo ...

  2. mysql导入到南大通用_oracle数据库迁移到GBase(南大通用)笔记

    最近和同事一起负责将oracle数据库迁移到国产数据库GBase上,本想着参考其他数据库的迁移方法,后来无意间发现GBase客户端里面有自带一个数据库迁移工具,话说对oracle.sql.mysql. ...

  3. MySql数据库主键外键与数据库设计

    MySql数据库主键外键与数据库设计 首先要指出的: 列.字段.属性是一个概念 行.记录.元组是一个概念 MySQL数据库CONSTRAINT约束:非空约束,唯一约束,主键约束,外键约束 show c ...

  4. 数据传输服务 DTS > 数据迁移 > 从自建数据库迁移至阿里云 > 源库为MySQL > 从自建MySQL迁移至RDS MySQL

    从自建MySQL迁移至RDS MySQL 更新时间:2020-08-20 10:49:52 编辑我的收藏 本页目录 前提条件 注意事项 费用说明 迁移类型说明 增量数据迁移支持同步的SQL操作 数据库 ...

  5. aws mysql迁移_AWS Data Migration Service-AWS数据库迁移服务-AWS中国区域

    AWS Database Migration Service 可帮助您快速并安全地将数据库迁移至 AWS.源数据库在迁移过程中可继续正常运行,从而最大程度地减少依赖该数据库的应用程序的停机时间.AWS ...

  6. ef mysql 读写分离_基于 EntityFramework 的数据库主从读写分离服务插件

    基于 EntityFramework 的数据库主从读写分离服务插件 1. 版本信息和源码 1.1版本信息 v1.01 beta(2015-04-07),基于 EF 6.1 开发,支持 EF 6.1 之 ...

  7. mysql数据的复制与恢复_MySQL 数据库的备份与恢复

    一.MySQL 常见的备份方式 1. 直接拷贝数据库文件(物理拷贝) 2. 使用 mysqldump 工具备份 3. 使用 mysqlhotcopy 工具备份 4. 使用 mysql 的主从同步复制, ...

  8. mysql数据意外删了怎么办_MySQL数据库意外崩溃导致表数据文件损坏无法启动怎么办...

    MySQL数据库意外崩溃导致表数据文件损坏无法启动怎么办 发布时间:2020-07-20 13:45:46 来源:亿速云 阅读:57 作者:小猪 这篇文章主要为大家展示了MySQL数据库意外崩溃导致表 ...

  9. sqoop将mysql数据导入到hive指定的数据库中

    本文作者:合肥工业大学 管理学院 钱洋 email:1563178220@qq.com 欢迎交流,禁止将本人博客直接复制下来,上传到百度文库等平台. 我们在使用hive时,经常需要建立一些库,以防止总 ...

最新文章

  1. Info:Memory module [DIMM] needs attention: Single-bit warning error rate exceeded, Single-bit fai...
  2. javascript 请求action传递中文参数乱码问题
  3. UIButton设置图片 在导航条上的 不显示
  4. spring security oauth rce (cve-2016-4977) 漏洞分析
  5. 得到不小于x的最小的2的幂
  6. 从人脸识别到内容审核,百度硬核AI技术推荐!
  7. PID参数整定法(2)
  8. flask (三) 重定向
  9. rabbitmq原理总结,Java反射的简单入门
  10. 没有编辑器时,使用echo更换源
  11. 并查集基础 模板题 hdu1232 畅通工程
  12. karto探秘之open_karto 第五章 --- 栅格地图的生成
  13. leancloud 怎么绑定域名_云引擎支持绑定加速域名 | LeanCloud 八月变化
  14. Ubuntu各类版本下载地址(网易镜像)
  15. 《商务与经济统计》学习笔记(三)
  16. 开源磁盘加密软件VeraCrypt教程
  17. SDN的前世今生-SDN是什么
  18. NOI Linux 2.0版发布
  19. 小程序快递单号查询接口物流助手对接指南
  20. mybatis-generator同名表的处理

热门文章

  1. 多边形周长计算(继承)
  2. js网页小游戏老虎不吃素
  3. Android老虎机
  4. 我的世界卸载java_《我的世界:地下城》出现恶性BUG 卸载会清空SSD
  5. DHU OJ | 基本练习-25 最小公倍数
  6. C#操作SqlServer MySql Oracle通用帮助类Db_Helper_DG(默认支持数据库读写分离、查询结果实体映射ORM)
  7. 快乐爪洼_JavaSE_基础语法,面向对象,异常处理,多线程
  8. Human-Like Machine Hearing With AI (1/3)--Applying neural networks in real-time audio signal process
  9. c# 使用FileStream 打开图片并显示
  10. gitbook 列表异常问题