EF
EF(实体框架)是一种 orm 【对象关系映射】
省略掉 ADO.NET 操作数据库 简化访问数据库【核心是 ADO.NET 操作数据库 EF 对其进行了封装】
EF 的三种模式
添加 ADO.NET 实体数据模型
-
DataBase First (数据库优先)首先生成数据库,根据数据库生成模型
-
Model First(模型优先)
-
Code First(代码优先)
EF 增删改查
查找
db.模型.find(id) 根据主键查找数据
CF cF = db.CF.Find(id);
或者
.where(lamda 表达式).FristOrDefault() 查找第一条数据
CF cF = (CF)db.CF.Where(c=>c.id==1).FirstOrDefault();
where 条件可以使用& 链接多个条件
CF cF = (CF)db.CF.Where(c=>c.id==1&c.name=="lili");
First() 取第一条数据 如果不存在会报错
SinglerOrDefault () 取单条数据 只能存在一条数据 多条数据时会报错
db.模型.FirstOrDefault(也可以写 lamda 表达式 n=>n.typeid=2)
CF cF = (CF)db.CF.FirstOrDefault(c=>c.id==1&c.name=="lili");
添加
Add() 和 AddRange()
操作相同 添加 单个模型 / 模型集合
db.CF.Add(cF);
db.SaveChanges();
修改
updatamodel()
EF 在mvc 特有的方法
不能直接操作传递的模型 因为传递的有的数据是 null 的 直接修改会将其他参数覆盖修改为 null
根据主键查找到模型 在使用 updatamodel 会根据当前的传递的模型去修改查找的数据模型
CF c = db.CF.Find(cF.id);
UpdateModel(cF);
db.SaveChanges();
2.修改模型状态 将实体状态进行修改
db.entry<模型类>(需要修改的模型数据).state=system.data.entry.entrystate.modified;
db.Entry(cF).State = EntityState.Modified;
db.SaveChanges();
删除
.remove()/removerange()
操作相同 删除 单个模型 / 模型集合
CF cF = db.CF.Find(id);
db.CF.Remove(cF);
db.SaveChanges();
removerange() 删除外键关联表很方便 通过 lamda 表达式找到的外键关联的数据表 进行删除
添加/修改/删除完成后 都需要 savechanges() 保存提交到数据库
Code First 创建 EF
-
创建与数据库的映射关系 【配置数据库链接字符串】
- 在 web.confing 配置数据库链接字符串
- 在 web.confing 配置数据库链接字符串
-
创建与表的映射关系【创建模型、创建上下文类】
- 创建模型(表)主键标记【key】
- 创建上下文类里的映射
- 创建模型(表)主键标记【key】
3. 运行项目时会自动创建数据库
数据库添加完成后 又进行的上下文类/模型的修改 报错
比如添加模型类里的字段,或者是再次添加新的模型类
1.删除数据库,运行项目 使其自动重新创建数据库(不实用 会删除之前库的所有数据)
2.进行数据迁移
需要进行 数据迁移
https://blog.csdn.net/jixiaomeng821/article/details/25165553
数据迁移
不删库,去更新数据库
在 工具-NuGet 包管理器-程序包管理器控制台
1.开启迁移 enable-migrations -force
会自动生成文件
2.添加迁移关系 Add-Migration init(–init 为自定义名称)
3.更新数据库 update-database
//再次修改 可以对 2.3 步重复进行
整体代码块操作
自动迁移
非自动迁移可以修改迁移过程中的数据库的数据
自动迁移会失去对迁移数据库过程的控制权
更新数据库 2(有问题未解决)
// 引用 EntityFramework
// DbContext 是 Entity Framework 中的一个类,它是一个轻量级的、封装了访问数据库的 API 的上下文类。
// 它提供了对数据库的访问和操作,允许你在应用程序中执行各种数据库操作,如查询、插入、更新和删除。
public class ExaminationEntities : DbContext
{
// 构造函数,用于初始化 ExaminationEntities 类的实例
// 在构造函数中,调用基类 DbContext 的构造函数,并传递数据库连接字符串的名称
public ExaminationEntities() : base("name=ExaminationEntities")
{
}
// 数据库表映射,表示数据库中的 ExamBankTypes 表
// 通过 DbSet<ExamBankType> 类型的对象,可以进行对 ExamBankTypes 表的访问和操作
public DbSet<ExamBankType> ExamBankTypes { get; set; }
// 重写 OnModelCreating 方法,用于配置实体类与数据库表之间的映射关系
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// 将实体类 ExamBankType 映射到数据库中的名为 "ExamBankTypes" 的表
modelBuilder.Entity<ExamBankType>().ToTable("ExamBankTypes");
}
}
// 表名映射,将实体类与数据库表 "ExamBankTypes" 关联起来
[Table("ExamBankTypes")]
public class ExamBankType
{
// 主键属性,自动生成唯一标识符
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ExamBankTypeId { get; set; }
public string Name { get; set; }
public int ParentId { get; set; }
public DateTime CreateTime { get; set; }
public int IsDelete { get; set; }
public int UserInfo_Id { get; set; }
}
更新数据库 3
在全局文件中 Global.asax.cs
设置在初始化时关闭 默认版本的上下文类 的初始化
DataBsae.SetInitializer<上下文类的名称>(null);
系统就会自动去 创建自己自定义 上下文类模型 的初始化
数据库中不会 更改 需要自己手动修改数据库的结构(自定义)