首先,什么是EF?(来自百度百科)
Entity Framework 利用了抽象化数据结构的方式,将每个数据库对象都转换成应用程序对象 (entity),而数据字段都转换为属性 (property),关系则转换为结合属性 (association),让数据库的 E/R 模型完全的转成对象模型,如此让程序设计师能用最熟悉的编程语言来调用访问。而在抽象化的结构之下,则是高度集成与对应结构的概念层、对应层和储存层,以 及支持 Entity Framework 的数据提供者 (provider),让数据访问的工作得以顺利与完整的进行。
再来看看为什么用EF而不用原生的Ado.Net?(来自传智播客黑马就业班视频)
1. 极大的提高开发效率:EF是微软自己的产品,跟VS开发工具集成度比较好,开发中代码都是强类型的,写代码效率非常高,自动化程度非常高,命令的编程。
2. EF提供的模型设计器非常强大,不仅仅带来了设计数据库的革命,也附带来的自动化生成模型代码的功能也极大的提高开发和架构的效率。
3. EF跨数据库支持是ORM架构的主要功能点之一,带来的是可以通过仅仅改变配置就可以做到跨数据库的能力。
4. 缺陷:性能差(生成sql脚本阶段),在复杂查询的时候生成的sql脚本效率不是很高。
a) 不在数据端额外的消耗性能。
b) 根据xml映射关系以及实体的状态生成相应的sql脚本。
5. 适合做企业内部管理系统:进销存、CRM(客户关系管理系统)、HR(人力资源)、OA、ERP、政务系统。但是做互联网不适合用EF。
EF的简单应用
/// <summary>
/// 添加操作
/// </summary>
public void add()
{
//1.实例化实体上下文
ceshiEntities dbContext = new ceshiEntities();
//2.声明一个T_Student实体
T_Student stu = new T_Student
{
Name = "sss",
Class = "sss",
College = "sss",
School = "sss"
};
//3.告诉上下文对此实体进行添加操作
dbContext.T_Student.Add(stu);
//dbContext.Entry<T_Student>(stu).State = System.Data.EntityState.Added;
//4.告诉上下文把实体的变化保存到数据库
dbContext.SaveChanges();
}
/// <summary>
/// 更新操作
/// </summary>
public void update()
{
//1.实例化实体上下文
ceshiEntities dbContext = new ceshiEntities();
//dbContext.Database.Connection.ConnectionString = "数据库连接字符串";//运行时修改链接字符串,用于加密重要信息
//2.声明一个实体
T_Student stu = new T_Student
{
Name = "ppp",
Class = "ppp",
College = "ppp",
School = "ppp-----",
ID = 1
};
//3.告诉上下文对此实体进行更新操作
//由于数据库中ID是主键,因此EF可以根据主键ID判断Where判断条件
//dbContext.T_Student.Attach(stu);//附加到上下文进行跟踪管理
//dbContext.Entry<T_Student>(stu).State = System.Data.EntityState.Detached;//取消上下文对stu实体的跟踪,释放内存
//dbContext.Entry<T_Student>(stu).State = System.Data.EntityState.Modified;//更新整个实体
dbContext.Entry<T_Student>(stu).Property<string>(m => m.School).IsModified = true;//更新实体中的School字段
//dbContext.Entry<T_Student>(stu).Property("School").IsModified = true;//更新实体中School字段
//4.告诉上下文保存到数据库中
dbContext.SaveChanges();
}
/// <summary>
/// 查询操作
/// </summary>
public void select()
{
ceshiEntities dbContext = new ceshiEntities();
直接使用EF
//foreach (var stu in dbContext.T_Student.Where(s=>s.ID>1 || s.ID==1))
//{
// Console.WriteLine(stu.ID + " " + stu.Name + " " + stu.Class + " " + stu.College + " " + stu.School);
//}
使用Linq查询语句
Linq表达式的返回值类型是IQueryable<T>
//var query = from s in dbContext.T_Student
// where s.ID > 1 || s.ID==1
// select s;
//foreach (var stu in query.ToList())
//{
// Console.WriteLine(stu.ID + " " + stu.Name + " " + stu.Class + " " + stu.College + " " + stu.School);
//}
IQueryable<T_Student> temp = from u in dbContext.T_Student
where u.ID > 1
select u;
//初始化了一下IQueryable接口里面的三个参数
//1 Linnq表达式转成Expression类型
//2 给Type ElementType赋值
//3 给IQueryProvider赋值,EF的provider
//当用到IQueryable接口的集合的数据的时候,provider解析Expression然后获取相应的数据。进行遍历执行
IQueryable<object> parent = temp;
//Dog aDog = new Dog();
//Animal aAnimal = aDog;
//List<Dog> lstDog = new List<Dog>();
List<Animal> lstAnimal = lstDog;
//List<Animal> lstAnimal2 = lstDog.Select(d => (Animal)d).ToList();
//IEnumerable<Dog> idog = null;
//IEnumerable<Animal> ianimal = idog;
System.Linq.Expressions.Expression<Func<int, bool>> expression = a => a > 0;
}