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 ...
随机推荐
- Android4.4中WebView无法显示图片解决方案
在Android4.4之前我们在使用WebView时为了提高加载速度我设置了(myWebView.getSettings().setBlockNetworkImage(true);//图片加载放在最后 ...
- [BZOJ2243][SDOI2011]染色 解题报告|树链剖分
Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“ ...
- [BZOJ2190&BZOJ2705]欧拉函数应用两例
欧拉函数phi[n]是表示1~n中与n互质的数个数. 可以用公式phi[n]=n*(1-1/p1)*(1-1/p2)*(1-1/p3)...*(1-1/pk)来表示.(p为n的质因子) 求phi[p] ...
- 【洛谷 P1666】 前缀单词 (Trie)
题目链接 考试时暴搜50分...其实看到"单词","前缀"这种字眼时就要想到\(Trie\)的,哎,我太蒻了. 以一个虚点为根,建一棵\(Trie\),然后\( ...
- libyuv编译【转】
转自:http://blog.csdn.net/kl222/article/details/41309541 版权声明:本文为博主原创文章,未经博主允许不得转载. 下载代码(要FQ): git clo ...
- Oracle基础 09 概要文件 profile
--创建 profile 概要文件create profile profile123 limit failed_login_attempts 2; --修改用户的 profile 文件alter u ...
- python 多进程multiprocessing 模块
multiprocessing 常用方法: cpu_count():统计cpu核数 multiprocessing.cpu_count() active_children() 获取所有子进程 mult ...
- maven多模块项目执行 deploy 时 忽略某些model (忽略war包)
maven deploy 时,通常需要忽略生成war的model,简单调整一下配置即可: <plugins> <plugin> <groupId>org.apach ...
- HDU-3221
Brute-force Algorithm Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- mysql 使用set names 解决乱码问题
引子: 最近查询公司线上表数据,返现在Xshell控制台打印的数据都是乱码,记得之前瞄过同事都是执行set names UTF8 , 解决的,特记录如下.