EF的三种方式
DataBase First(数据库优先):提前先创建好数据库,根据数据库,自动生成.edmx
文件,.edmx文件生成模型类
Model First(模型优先):先创建.edmx文件,.edmx文件创建数据库和模型类
Code First(代码优先):程序员自己写模型类,然后自动生成数据库。没有Edm。
DataBase First
创建
在项目中,右键添加,新建项
这个就是从数据库生成Database First
跟着步骤来,跟着步骤连接数据库,半自动化,也不用自己写连接字符串,都是系统亲力亲为。
创建出来的东西介绍
创建好了现在项目中多出了这个Model1.tt
下面的Sex.cs
和Students.cs
就是映射出来的对象模型
更新数据模型
如果数据库发生了变化,DataBase Frist创建的数据模型不会自动更新,需要手动进行更新。导致了以数据库为主,代码跟着数据库的变化为变化。
Model First
创建
设计实体数据模型
弄完后是空的
可以右键新建实体,或者用工具箱拖拽。
一张表一个实体。表里面的全部字段都是标量属性,点击实体右键可以新增加属性。
在VS的右下角属性这里可以设置 实体的属性(如果属性框被关了,点击实体的某个属性,按F4)
表中肯定有主外键关系。添加表之间的关联,选中其中一个表,右键,新增,关联.
这里的关系是,学生的sexid对应性别表。 学生——性别,多对一。多个学生可以是相同的性别,一百一千个学生,对应性别的男性。 性别——学生,一对多。一个男性性别,可以对应很多个学生
根据模型生成数据库
确保数据库中已经存在一个空白数据库,新建一个空白数据库
然后在vs的模型设计视图里面右键
选择数据库中那个空的数据库
系统自动生成了一个SQL脚本,点击右键运行。看到数据库自动生成的表了
好像没有给自动生成,实体对象类,emmm自己创建?
Code First
Code First 这种方式需要先写一些代码,如实体对象,数据关系等,然后根据已有的代码描述,自动创建数据对象。但其实这种方法与Model First是非常类似的。我们自己写的代码,其实就是用代码表示实体模型,而Model First是用可视化的方式描述了实体模型
使用这种方式前提是要有EF的引用,用NuGet
创建实体对象类
需要添加System.ComponentModel.DataAnnotations这个引用(类名后的Attributekey省略),此引用可添加模型组件特性的注释如:主键、字符长度、表名字、列名字、以及是否映射到数据库等。 System.ComponentModel.DataAnnotations.Schema可以设置表名,列名等。 详情看Code First 数据批注
如果有主外键的表,添加约定。学生是外键表,性别是主键表。
学生->性别:多对一的关系。
性别->学生:一对多的关系。
一群学生可以都是一个性别。一个性别可以对应多个学生。
在主键表(性别)里面添加一个学生集合类型的属性。性别对应多个学生嘛。在外键表(学生)里面添加性别类型的属性,一个学生只有一个性别嘛。
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1.Model
{
[Table("Sex")]
class Sex
{
[Key]//表示唯一标识,主键,这是简化名称,全名KeyAttribute
public int Sex_id { get; set; }
[MaxLength(2)]
public string Sex_name { get; set; }
//约定,一个性别对应多个学生
public virtual ICollection<Students> Students { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Entity;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace ConsoleApp1.Model
{
[Table("Students")]
class Students
{
[Key]
public int Stu_id { get; set; }
[MaxLength(8)]
public string Stu_name { get; set; }
public int Stu_sexid { get; set; }
[Range(9999.99,0.01)]
public decimal Stu_money { get; set; }
public int Stu_score { get; set; }
//约定,一个学生还有一个性别
public virtual Sex Sex { get; set; }
}
}
创建数据管理类
接着我们创建数据库管理类:CodeFirstContext,它继承于DbContext类(System.Data.Entity)。写一下这个类的构造函数,将Value传进去,Value就是配置文件中链接数据库的代码以及一个关于驱动的代码,要注意其中的对应关系,最后把实体放到集合就可以了。
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1.Model
{
class CodeFirstContext: DbContext
{
//构造函数
public CodeFirstContext()
: base("CodeF")//DbContext的构造器传入一个配置文件的name的值,或者链接字符串
{
}
//这个类对象一旦创建数据库,以下表就会被创建
public DbSet<Students> Students { get; set; }
public DbSet<Sex> Sex { get; set; }
}
}
修改配置文件
<!--这是自己添加的代码-->
<connectionStrings>
<add name="CodeF" connectionString="Data Source=.;Initial Catalog=TestORM;Integrated Security=True;" providerName="System.Data.SqlClient"/>
</connectionStrings>
创建数据库
using ConsoleApp1.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
//创建管理对象
CodeFirstContext dbcontext = new CodeFirstContext();
//创建数据库,执行有点慢,20s内
dbcontext.Database.CreateIfNotExists();
Console.WriteLine("执行完成");
}
}
}
这时候数据库里面就创建完成了