什么是实体框架EF(Entity Framework)
Entity Framework 应用程序的概述
实体框架(Entity Framework)是微软以ADO.Net为基础开发出来的对象关系映射(ORM)解决方案,它解决了对象持久化问题,将程序员从编写麻烦的SQL语句当中解放出来。相对于传统的ADO等各种数据库操纵技术来说,微软的ADO.Net更为先进,它封装了很多底层操作,抽象了接口,针对接口编程,将调用统一化。
Entity Framework 应用程序的优点
1、应用程序可以通过更加以应用程序为中心的概念性模型(包括具有继承性、复杂成员和关系的类型)来工作。
2、应用程序不再对特定的数据引擎或存储架构具有硬编码依赖性。
3、可以在不更改应用程序代码的情况下更改概念性模型与特定于存储的架构之间的映射。
4、开发人员可以使用可映射到各种存储架构(可能在不同的数据库管理系统中实现)的一致的应用程序对象模型。
5、多个概念性模型可以映射到同一个存储架构。 · 语言集成查询支持可为查询提供针对概念性模型的编译时语法验证。
不建议使用Entity Framework 应用程序的情况
• 实时的应用程序。
• 只能通过存储过程访问数据库。 EF的优势是:跟踪实体状态Change时,不仅仅在存储过程上.(即使EF确实对存储过程支持有限的)。
• 频繁插入操作(Insert), 并且EF不支持大数据Bulk 插入。
• 频繁更新操作,更新的目标主要是当多行(用一个单值)
• 反范式的表设计和高性能查询。 EF产生查询,他们是难以维护的,它并不能很好地支持映射到不规范的表。
• 对程序有非常的性能要求, 需要对每个查询进行监控。
Entity Framework 应用程序的编写
举例:
现有表ClassInfo
使用Entity Framework 应用程序实现简单的增删改查
以下增删改查运用于控制器中,不创建视图的情况下直接通过URL路径来进行代码的执行。
新增:
方法一
运用new对象,把数据存入临时数据中,调用Add方法来进行新增。
```csharp
var classinfo = new ClassInfo()
{
Name = "2018173807",
Remark = "七班",
Term = 1,
TeacherID = 2
};
db.ClassInfos.Add(classinfo);
db.SaveChanges();
方法二`
运用Entity对象,把存入数据的状态改为新增状态。
```csharp
var classinfo = new ClassInfo()
{
Name = "2018173807",
Remark = "七班",
Term = 1,
TeacherID = 2
};
db.Entry(classinfo).State = System.Data.Entity.EntityState.Added;
db.SaveChanges();
方法三
运用AddRange对象和数组,进行批量新增。
```csharp
List<ClassInfo> classInfos = new List<ClassInfo>() {
new ClassInfo(){
Name = "2018173801",
Remark = "一班",
Term = 1,
TeacherID = 2
},
new ClassInfo(){
Name = "2018173802",
Remark = "二班",
Term = 1,
TeacherID = 2
}
};
db.ClassInfos.AddRange(classInfos);
db.SaveChanges();
删除:
方法一
调用Remove方法来进行删除。
```csharp
var classinfo=db.ClassInfos.Find(1);
db.ClassInfos.Remove(classinfo);
db.SaveChanges();
方法二`
批量删除
```csharp
List<ClassInfo> classInfosd = db.ClassInfos.Where(p => p.Term==4).ToList();
db.ClassInfos.RemoveRange(classInfosd);
db.SaveChanges();
修改:
方法一
修改方法一:先查询再修改,修改谋个熟悉,不会影响其他属性变化
var set = db.ClassInfos.Find(6);
set.Remark = "666";
db.SaveChanges();
方法二
修改方法二:new对象,将对象的状态,改为修改状态,这样可能将其他属性设置为空
var classinfoset = new ClassInfo()
{
ID = 1,
Name = "2018173801",
Remark = "一班",
Term = 1,
TeacherID = 2
};
db.Entry(classinfoset).State = System.Data.Entity.EntityState.Modified;
db.SaveChanges();
查询:
精准查询-查询班级号为2018173806的
var classinfos1 = db.ClassInfos.Where(p => p.Name == "2018173806").ToList();
db.SaveChanges();
模糊查询 查询班级号含有2018的
var classinfos2 = db.ClassInfos.Where(p => p.Name.Contains("2018")).ToList();
db.SaveChanges();
组合查询 查询学期是2同时教师也是1
var classinfo3 = db.ClassInfos.Where(p => p.Term == 2 && p.TeacherID == 1).ToList();
db.SaveChanges();
组合查询 查询学期是2或者教师是1的
var classinfo4 = db.ClassInfos.Where(p => p.Term == 2 || p.TeacherID == 1).ToList();
db.SaveChanges();