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的更多相关文章

  1. ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库

    在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...

  2. Entity Framework Core 1.1 升级通告

    原文地址:https://blogs.msdn.microsoft.com/dotnet/2016/11/16/announcing-entity-framework-core-1-1/ 翻译:杨晓东 ...

  3. Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制

    将通用的序列号生成器库 从SQL Server迁移到Mysql 遇到的一个问题,就是TimeStamp/RowVersion并发控制类型在非Microsoft SQL Server数据库中的实现.SQ ...

  4. 采用MiniProfiler监控EF与.NET MVC项目(Entity Framework 延伸系列1)

    前言 Entity Framework 延伸系列目录 今天来说说EF与MVC项目的性能检测和监控 首先,先介绍一下今天我们使用的工具吧. MiniProfiler~ 这个东西的介绍如下: MVC Mi ...

  5. 来,给Entity Framework热热身

    先来看一下Entity Framework缓慢的初始化速度给我们更新程序带来的一种痛苦. 我们手动更新程序时通常的操作步骤如下: 1)把Web服务器从负载均衡中摘下来 2)更新程序 3)预热(发出一个 ...

  6. 采用EntityFramework.Extended 对EF进行扩展(Entity Framework 延伸系列2)

    前言 Entity Framework 延伸系列目录 今天我们来讲讲EntityFramework.Extended 首先科普一下这个EntityFramework.Extended是什么,如下: 这 ...

  7. Entity Framework教程(第二版)

    源起 很多年前刚毕业那阵写过一篇关于Entity Framework的文章,没发首页却得到100+的推荐.可能是当时Entity Framework刚刚发布介绍EF的文章比较少.一晃这么多年过去了,E ...

  8. Entity Framework 6 Recipes 2nd Edition 译 -> 目录 -持续更新

    因为看了<Entity Framework 6 Recipes 2nd Edition>这本书前面8章的翻译,感谢china_fucan. 从第九章开始,我是边看边译的,没有通读,加之英语 ...

  9. ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第一章:创建基本的MVC Web站点

    在这一章中,我们将学习如何使用基架快速搭建和运行一个简单的Microsoft ASP.NET MVC Web站点.在我们马上投入学习和编码之前,我们首先了解一些有关ASP.NET MVC和Entity ...

随机推荐

  1. nginx 静态文件支持跨域访问权限

    一.原生态 location ^~ /repurchase-web/ {          alias /var/www/webapps/repurchase-web/;        } 二.支持跨 ...

  2. Ubuntu 12.04更新源(转)

    1.首先备份Ubuntu12.04源列表 sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup (备份下当前的源列表) 2.修改更新源 ...

  3. 入门级:GitHub和Git超超超详细使用教程!

    GitHub和Git入门 考虑到大家以前可能对版本控制工具和Linux命令行工具都不了解,我写了一个简单的博客来让大家学会入门使用方法. GitHub的简单使用 第一步 创建GitHub账号 1. 打 ...

  4. HDU2177取(2堆)石子游戏---(威佐夫博弈)

    http://acm.hdu.edu.cn/showproblem.php?pid=2177 取(2堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others)    M ...

  5. Spring Session使用及源码解析

    参照: http://blog.csdn.net/wojiaolinaaa/article/details/62424642 总结点spring session的一些知识点: spring通过过滤器, ...

  6. 【bzoj3510】首都 LCT维护子树信息(+启发式合并)

    题目描述 在X星球上有N个国家,每个国家占据着X星球的一座城市.由于国家之间是敌对关系,所以不同国家的两个城市是不会有公路相连的. X星球上战乱频发,如果A国打败了B国,那么B国将永远从这个星球消失, ...

  7. 如何打开小米,oppo,华为等手机的系统应用的指定页面

    如题,拿Oppo 手机做个示例,小米 华为也是如此. 在编写Android应用的时候,我们经常会有这样的需求,我们想直接打开系统应用的某个页面.比如在Oppo R9 手机上我们想打开某个应用的通知管理 ...

  8. Ubuntu 下nginx 的卸载 与重新装

    由于本人把自己服务器的nginx 给玩坏了,不得已选择卸载重新安装,(先让我哭一会) 然后我把/usr/sbin/nginx  和/etc/nginx 和/usr/share/nginx 和 /usr ...

  9. django unresolved template

    参考:https://stackoverflow.com/questions/8487410/pycharm-django-1-3-static-url-in-templates-unresolved ...

  10. Linux利用list_head结构实现双向链表

    原文地址:http://www.cnblogs.com/bastard/archive/2012/10/19/2731107.html 通常实现双向链表的数据结构: struct list_node1 ...