Entity Framework part2
EF原理
以XML方式打开edmx文件,这个XML的文件主要包含两大部分:Runtime是类模型部分,Designer是VS中的图形界面
重点讨论的是Runtime部分,又分为三大部分:
SSDL数据模型部分
CSDL概念模型部分
C-S Mapping映射规则部分
画图演示ORM与edmx中的对应关系
根据映射关系和实体状态完成sql的生成
Entity Framework 利用了抽象化数据结构的方式,将每个数据库对象都转换成应用程序对象 (entity),而数据字段都转换为属性 (property),关系则转换为结合属性 (association),让数据库的 E/R 模型完全的转成对象模型,如此让程序设计师能用最熟悉的编程语言来调用访问。而在抽象化的结构之下,则是高度集成与对应结构的概念层、对应层和储存层,以及支持 Entity Framework 的数据提供者 (provider),让数据访问的工作得以顺利与完整的进行。
概念层E:负责向上的对象与属性显露与访问
对应层M:将上方的概念层和底下的储存层的数据结构对应在一起。
储存层D:依不同数据库与数据结构,而显露出实体的数据结构体,和 Provider 一起,负责实际对数据库的访问和 SQL 的产生
EF中操作数据库的网关:上下文
ObjectContext封装 .NET Framework 和数据库之间的连接。此类用作“创建”、“读取”、“更新”和“删除”操作的网关。
ObjectContext 类为主类,用于与作为对象(这些对象为 EDM 中定义的实体类型的实例)的数据进行交互。
ObjectContext 类的实例封装以下内容:
到数据库的连接,以 EntityConnection 对象的形式封装。
描述该模型的元数据,以 MetadataWorkspace 对象的形式封装
用于管理缓存中持久保存的对象的 ObjectStateManager 对象
注意:在EF4.0之前的版本中都是EF访问数据库的入口是ObjectContext。而在EF4.1之后的版本中最新的数据库访问上下文的入口改成了DbContext。本质上来说:DbContext继承了ObjectContext类,所以新版本中不能直接使用ObjectContext里面的方法和属性等,但基本底层的东西还是一致的。


EF相比Ado.Net的优点
极大的提高开发效率,EF是微软自己的产品,跟VS开发工具集成度比较好,开发中代码都是强类型的,写代码效率非常高,自动化程序非常高,命令式的编程
EF提供的模型设计器非常强大,不仅仅带来了设计数据库的革命,也附带来的自动化生成模型代码的功能也极大的提高开发和架构设计的效率
EF跨数据库支持是ORM框架主要功能点之一,带来的可以是通过仅仅改变配置就可以做到跨数据库的能力
缺陷:性能差(生成sql脚本阶段),在复杂查询的时候生成的sql脚本效率不是很高
EF相对Ado.Net的缺点
问1:EF性能好不好呢?
答1:不好,性能有损耗
问2:损耗在哪里呢?
答3:数据库端性能损耗是一样的;损消耗在将对象状态转换为SQL语句时损失性能,但是更换数据库是非常方便的
Model First
在项目一开始,没有数据库时,可以借助EF设计模型,然后根据模型同步,完成数据库中表的创建,这就是ModelFirst开发方式
示例:创建模型BookInfo、BookType
属性的类型:
这里的类型都是CTS中的类型,即IL中使用的类型
Int32
String,可以选择是否采用Unicode编码,如果采用则对应着sql server中的nvarchar类型
Decimal,表示指定小数位数及数据精度的类型,范围表示小数个数,精度显示总的数据位数
属性“可以为Null”
属性“实体键”:表示设置主键
关联:
1:1性能低(不会延迟加载,添加时必须同时创建两个对象),不要使用,可以自己实现逻辑代码完成这种操作,可以查看一下表结构,本质还是1:m的结构
1:m
m:n:可以手动创建中间表采用1:m关系,也可以直接使用此种关系,EF会自动创建中间表
在创建关联时,可以选择是否要创建导航属性、外键
导航属性
根据关系的不同,查看生成的导航属性的类型
示例:1对多关系中,对于多端表数据的插入
方法SaveChange():执行所有的命令树,会采用事物机制执行
同步
从数据库更新模型
根据模型生成数据库:删除表后再创建表,会导致表中原有数据丢失;建议手动修改表结构
CodeFirst
对于已经存在了模型类型的项目,怎么使用EF呢?Code first,也叫POCO+Code Only
code only,顾名思义,只需要代码不需要Edmx模型,EF提供了通过类型的结构推断生成Sql并创建数据库中的表,而且能够通过类型的成员推断出实体间的关系的功能,开发人员只需要编写实体类就可以进行EF对数据库的开发
优势:开发更进一步简洁化。开发效率又一次提高。自动化程度进一步提高。可以适用于原有的老项目
劣势:性能不怎么好。了解的人比较少
引入程序集EntityFramework,System.Data.Entity
在配置文件中写连接字符串
创建模型类(如果项目中已经有模型类,则只需要维护关系)
通过导航属性来表示类的关系,注意:导航属性设置成virtual,可以实现延迟加载
特性维护:Table,Key,ForeignKey
创建上下文类,继承自DbContext
调用父类构造方法,传递连接字符串"name=***"
根据类型创建数据库表
使用context.Database.CreateIfNotExists()完成数据库中表的创建
调用context.SaveChanges()方法完成保存
关键:上下文,实体类的约束及关系
使用EF与MVC的三层
Entity Framework part2的更多相关文章
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库
在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...
- Entity Framework Core 1.1 升级通告
原文地址:https://blogs.msdn.microsoft.com/dotnet/2016/11/16/announcing-entity-framework-core-1-1/ 翻译:杨晓东 ...
- Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制
将通用的序列号生成器库 从SQL Server迁移到Mysql 遇到的一个问题,就是TimeStamp/RowVersion并发控制类型在非Microsoft SQL Server数据库中的实现.SQ ...
- 采用MiniProfiler监控EF与.NET MVC项目(Entity Framework 延伸系列1)
前言 Entity Framework 延伸系列目录 今天来说说EF与MVC项目的性能检测和监控 首先,先介绍一下今天我们使用的工具吧. MiniProfiler~ 这个东西的介绍如下: MVC Mi ...
- 来,给Entity Framework热热身
先来看一下Entity Framework缓慢的初始化速度给我们更新程序带来的一种痛苦. 我们手动更新程序时通常的操作步骤如下: 1)把Web服务器从负载均衡中摘下来 2)更新程序 3)预热(发出一个 ...
- 采用EntityFramework.Extended 对EF进行扩展(Entity Framework 延伸系列2)
前言 Entity Framework 延伸系列目录 今天我们来讲讲EntityFramework.Extended 首先科普一下这个EntityFramework.Extended是什么,如下: 这 ...
- Entity Framework教程(第二版)
源起 很多年前刚毕业那阵写过一篇关于Entity Framework的文章,没发首页却得到100+的推荐.可能是当时Entity Framework刚刚发布介绍EF的文章比较少.一晃这么多年过去了,E ...
- Entity Framework 6 Recipes 2nd Edition 译 -> 目录 -持续更新
因为看了<Entity Framework 6 Recipes 2nd Edition>这本书前面8章的翻译,感谢china_fucan. 从第九章开始,我是边看边译的,没有通读,加之英语 ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第一章:创建基本的MVC Web站点
在这一章中,我们将学习如何使用基架快速搭建和运行一个简单的Microsoft ASP.NET MVC Web站点.在我们马上投入学习和编码之前,我们首先了解一些有关ASP.NET MVC和Entity ...
随机推荐
- (转)Python中实现带Cookie的Http的Post请求
转自crifan: http://www.crifan.com/python_http_post_request_with_cookie/ . . . .
- node搭建文件服务器
python可以在目录下python -m http.server 8080来启动一个静态文件服务器,使用node实现一个 运行node fileServer.js D:\lanFeature 即可将 ...
- 在Debian9安装node和npm
这学期又快结束了,坐在每天面对的电脑面,本着整理资料.更换心情的目的,我重装了一下自己的debian.下面就将自己安装node的过程进行记录与分享. node的官网:https://nodejs.or ...
- HDU2057
http://acm.hdu.edu.cn/showproblem.php?pid=2057 涉及到16进制内的加法,可以用%I64x直接来处理,要注意到16进制中负数是用补码来表示的.一个比较困惑的 ...
- SSM初步整合一
SSM(spring+springmvc+mybatis)初步整合一配置步骤: 步骤一.导入所需jar包 步骤二 .配置web.xml文件 <?xml version="1.0&quo ...
- 【洛谷 P3304】[SDOI2013]直径(树的直径)
题目链接 题意,求一棵树被所有直径经过的边的条数. 这题是我们8.25KS图论的最后一题,当时我果断打了暴力求所有直径然后树上差分统计的方法,好像有点小问题,boom0了. 考完改这题,改了好久,各种 ...
- Django【进阶】缓存
Django缓存 由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者me ...
- linux内核同步之每CPU变量、原子操作、内存屏障、自旋锁【转】
转自:http://blog.csdn.net/goodluckwhh/article/details/9005585 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 一每 ...
- 【 VSFTPD 】ftp 客户端问题
网络环境: 两个独立的内网环境,前端都有路由和防火墙的管控.要在这两个独立的内网使用ftp通过互联网进行通信. 首先,ftp server 服务端口默认修改为:2100 数据端口修改为:21000 将 ...
- hdu 3006(状态压缩)
The Number of set Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...