EF的三种方式

DataBase First(数据库优先):提前先创建好数据库,根据数据库,自动生成.edmx文件,.edmx文件生成模型类
Model First(模型优先):先创建.edmx文件,.edmx文件创建数据库和模型类
Code First(代码优先):程序员自己写模型类,然后自动生成数据库。没有Edm。

DataBase First

创建

在项目中,右键添加,新建项
image.png
这个就是从数据库生成Database First
image.png
跟着步骤来,跟着步骤连接数据库,半自动化,也不用自己写连接字符串,都是系统亲力亲为。

创建出来的东西介绍

创建好了现在项目中多出了这个
image.pngimage.png
Model1.tt下面的Sex.csStudents.cs就是映射出来的对象模型
image.png

更新数据模型

如果数据库发生了变化,DataBase Frist创建的数据模型不会自动更新,需要手动进行更新。导致了以数据库为主,代码跟着数据库的变化为变化。

点击Model1.edmx文件,在这个页面右键
image.png
image.png

Model First

创建

和DataBase First创建差不多,这里选择空模型
image.png

设计实体数据模型

弄完后是空的
可以右键新建实体,或者用工具箱拖拽。
image.png
一张表一个实体。表里面的全部字段都是标量属性,点击实体右键可以新增加属性。
在VS的右下角属性这里可以设置 实体的属性(如果属性框被关了,点击实体的某个属性,按F4)
image.png
表中肯定有主外键关系。添加表之间的关联,选中其中一个表,右键,新增,关联.

这里的关系是,学生的sexid对应性别表。 学生——性别,多对一。多个学生可以是相同的性别,一百一千个学生,对应性别的男性。 性别——学生,一对多。一个男性性别,可以对应很多个学生

image.png
之后导航属性和关联线就出来了
image.png

根据模型生成数据库

确保数据库中已经存在一个空白数据库,新建一个空白数据库

然后在vs的模型设计视图里面右键
image.png
选择数据库中那个空的数据库
image.png
系统自动生成了一个SQL脚本,点击右键运行。看到数据库自动生成的表了
image.png

好像没有给自动生成,实体对象类,emmm自己创建?

Code First

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

使用这种方式前提是要有EF的引用,用NuGet

创建实体对象类

需要添加System.ComponentModel.DataAnnotations这个引用(类名后的Attributekey省略),此引用可添加模型组件特性的注释如:主键、字符长度、表名字、列名字、以及是否映射到数据库等。 System.ComponentModel.DataAnnotations.Schema可以设置表名,列名等。 详情看Code First 数据批注

如果有主外键的表,添加约定。学生是外键表,性别是主键表。
学生->性别:多对一的关系。
性别->学生:一对多的关系。
一群学生可以都是一个性别。一个性别可以对应多个学生。
在主键表(性别)里面添加一个学生集合类型的属性。性别对应多个学生嘛。在外键表(学生)里面添加性别类型的属性,一个学生只有一个性别嘛。

详情看Code First 约定

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel.DataAnnotations;
  4. using System.ComponentModel.DataAnnotations.Schema;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. namespace ConsoleApp1.Model
  9. {
  10. [Table("Sex")]
  11. class Sex
  12. {
  13. [Key]//表示唯一标识,主键,这是简化名称,全名KeyAttribute
  14. public int Sex_id { get; set; }
  15. [MaxLength(2)]
  16. public string Sex_name { get; set; }
  17. //约定,一个性别对应多个学生
  18. public virtual ICollection<Students> Students { get; set; }
  19. }
  20. }
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Data.Entity;
  7. using System.ComponentModel.DataAnnotations;
  8. using System.ComponentModel.DataAnnotations.Schema;
  9. namespace ConsoleApp1.Model
  10. {
  11. [Table("Students")]
  12. class Students
  13. {
  14. [Key]
  15. public int Stu_id { get; set; }
  16. [MaxLength(8)]
  17. public string Stu_name { get; set; }
  18. public int Stu_sexid { get; set; }
  19. [Range(9999.99,0.01)]
  20. public decimal Stu_money { get; set; }
  21. public int Stu_score { get; set; }
  22. //约定,一个学生还有一个性别
  23. public virtual Sex Sex { get; set; }
  24. }
  25. }

创建数据管理类

接着我们创建数据库管理类:CodeFirstContext,它继承于DbContext类(System.Data.Entity)。写一下这个类的构造函数,将Value传进去,Value就是配置文件中链接数据库的代码以及一个关于驱动的代码,要注意其中的对应关系,最后把实体放到集合就可以了。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data.Entity;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. namespace ConsoleApp1.Model
  8. {
  9. class CodeFirstContext: DbContext
  10. {
  11. //构造函数
  12. public CodeFirstContext()
  13. : base("CodeF")//DbContext的构造器传入一个配置文件的name的值,或者链接字符串
  14. {
  15. }
  16. //这个类对象一旦创建数据库,以下表就会被创建
  17. public DbSet<Students> Students { get; set; }
  18. public DbSet<Sex> Sex { get; set; }
  19. }
  20. }

修改配置文件

image.png

  1. <!--这是自己添加的代码-->
  2. <connectionStrings>
  3. <add name="CodeF" connectionString="Data Source=.;Initial Catalog=TestORM;Integrated Security=True;" providerName="System.Data.SqlClient"/>
  4. </connectionStrings>

创建数据库

  1. using ConsoleApp1.Model;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. namespace ConsoleApp1
  8. {
  9. class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13. //创建管理对象
  14. CodeFirstContext dbcontext = new CodeFirstContext();
  15. //创建数据库,执行有点慢,20s内
  16. dbcontext.Database.CreateIfNotExists();
  17. Console.WriteLine("执行完成");
  18. }
  19. }
  20. }

这时候数据库里面就创建完成了
image.png