1、EF是什么?
全称EntityFramework,官方解释是ADO.NET(专门用于访问数据库的组件)中的一套支持面向数据的软件应用程序的技术,是微软的一个ORM(object relation mapping)框架。
Entity Framework是ORMapping的一种具体实现,那ORMapping又是什么呢?ORM–ObjectRelation
Mapping,即对象关系映射框架/数据持久化框架,是根据实体对象操作数据表中数据的一种面向对象的操作框架.
2、EF的框架模式?
1、DataBase First传统的表驱动方式创建EDM,然后通过EDM生成模型和数据层代码。除生成实体模型和自跟踪实现模型,还支持生成轻型DbContext。
2、Model First先创建EDM模型,再生成DDL数据库脚本和模型和数据层代码。除生成实体模型和自跟踪实现模型,支持生成轻型DbContext。
3、Code First手动创建POCO模型,数据层DbContext及映射关系,通过Database.SetInitializer生成数据库,这种方式较灵活,但是代码工作较多。
3、EF框架优缺点
优点:
1.简洁的Linq to Sql语句大大提高了开发人员的效率,不要再写复杂的sql语句;
2.不再需要再管应用程序如何去连接数据库;
3.EF可以用作用于数据服务和OData Service的基础设施;
缺点:
1.由于linq语句编译之后就是sql,对于这种自动生成的sql语句无法控制;
2.EF的运行机制会消耗大量内存,大大降低了程序运行效率,从而导致降低了用户在客户端的体验效果;
3.一旦数据结构发生变化,需要更新EF数据model;有时还可能会出现找不到更新过的实体类这种情况;
4、进行增删改查实例
4.1、直接新增
var student= new Student()
{
//所要新增的字段如:
Name="张三"
};
db.Students.Add(student);
db.SaveChanges();
4.1.2、改变状态新增
var student = new Student()
{
//所要新增的字段如:
Name="张三"
};
db.Entry(student).State = System.Data.Entity.EntityState.Added;
db.SaveChanges();
4.1.3、批量新增
List<ClassInfo> classInfos = new List<ClassInfo>() {
new ClassInfo(){
Name = "2018173801",
TeacherID = 1,
Term = 1,
Remark = "一班"
},
new ClassInfo(){
Name = "2018173802",
TeacherID = 1,
Term = 1,
Remark = "二班"
}
};
db.ClassInfos.AddRange(classInfos);
db.SaveChanges();
4.2、修改
4.2.1、先查询后修改,这样不会影响其他字段
var classinfo = db.ClassInfos.Find(3); //查找出ID为3
classinfo.Remark = "这个班很棒";
db.SaveChanges();
4.2.2、new对象,将对象的状态,改为修改状态,这样可能将其他属性设置为空
var classinfos = new ClassInfo()
{
ID = 4,
Name = "2018173803",
TeacherID = 1,
Term = 1,
Remark = "这个班很棒"
};
db.Entry(classinfos).State = System.Data.Entity.EntityState.Modified;
db.SaveChanges();
4.3、删除
4.3.1、删除,先查询后删除,删除ID为6的
var classinfo = db.ClassInfos.Find(6);
db.ClassInfos.Remove(classinfo);
db.SaveChanges();
4.3.2、改变状态进行删除
var clasinfo = new ClassInfo()
{
ID = 6
};
db.Entry(clasinfo).State = System.Data.Entity.EntityState.Deleted;
db.SaveChanges();
4.3.3、批量删除
List<ClassInfo> classInfos = db.ClassInfos.Where(p => p.Remark == "四班").ToList(); //查询出Remark为四班集合
db.ClassInfos.RemoveRange(classInfos); //Remark为四班批量删除
db.SaveChanges();
return View();
4.4、查询
//精确查询,查询班级号为2018173806
var classinfos = db.ClassInfos.Where(p => p.Name == "2018173806").ToList();//没有ToList将只会有一个查询语句,不会有结果
//模糊查询,查询班级号有2018
var classinfos2 = db.ClassInfos.Where(p => p.Name.Contains("2018")).ToList();//Contains为包含的意思
//组合查询 查询学期为1, 同时教师也是1
var classinfos3 = db.ClassInfos.Where(p => p.Term == 1 && p.TeacherID == 1).ToList();
//组合查询 查询学期为2或者教师也是2
var classinfos4 = db.ClassInfos.Where(p => p.Term == 2 || p.TeacherID == 2).ToList();