| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 11348 人关注过本帖, 2 人收藏
标题:摆脱ADO.NET瓶颈 手把手教你学习EF6到EF7(一)
取消只看楼主 加入收藏
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
结帖率:80.91%
收藏(2)
 问题点数:0 回复次数:8 
摆脱ADO.NET瓶颈 手把手教你学习EF6到EF7(一)
打算这一周研究一下EF7 因为之前接触过EF6 所以打算开一个长期的帖子 权当自己不会 跟大家一起从0学起EF EF是啥? ORM是啥  为啥不用了 ? 这都是问题 这都是一个.NET程序员 将来所要面对的问题 和所要提高的地方 当然 我无知了 因为我也在摸索 你们就权当我二两白酒喝高了胡扯
当然咱们慢慢来 先从最基本的ORM 说起
(一)ORM框架
ORM(Object Relational Mapping)框架采用元数据来描述对象一关系映射细节,元数据一般采用XML格式,并且存放在专门的对象一映射文件中。
官方解释 啥玩意 完全不懂 没关系 ORM 对象关系映射 什么是对象关系映射 此处我用最简单的说法让大家明白
ORM 它的作用是在关系型数据库和业务实体对象之间作一个映射(为啥映射 你不用管了 它内部机制 反正就是映射了 起反应了 ) 这样 我们在具体的操作业务对象的时候 就不需要再去和复杂的SQL语句打交道 只需简单的操作对象的属性和方法 换句话说我SQL不好写的不好 不标准 不够优化没关系 因为我有ORM框架 它会自动帮我生成我想要的SQL (很强大吧? ) 而且我可以专注于编码 在不用一会写前端 一会写后端和数据库打交到 (等等 如果此处还不懂 那我在举一个例子)

例子: test1 test2两位程序员 一个用 一个用ORM框架 对同一软件产品(增删改差)进行开发 语言C# 开发工具 数据库sqlserver2014 你懂的 反正不是记事本
咱们先看看test1的操作步骤
test1: 我先搭建了一个三层 然后开发 我系统都设计完毕了 我先开发数据层 先写DBHelper吧  然后业务逻辑 最后在写前端 嗯思路很明确
test2:  我直接写业务逻辑 调用数据库开发的我完全不用考虑 ORM会自动和数据库映射生成我想要的SQL语句  我只专注于业务逻辑就可以了 然后最后写前端
看看起点就不一样 test1写数据层的时候 也SQL语句的时候 test2根本不用考虑这些 而是专注与业务 当你开发一个应用程序的时候 你可能会写不少数据访问层的代码 用来从数据库保存,删除,读取对象信息 等等等等 你在DAL中写了很多的方法来读取对象数据 改变状态对象等等任务 而这些代码写起来总是重复的 而这些ORM会自动帮你生成
OK  过了一段时间 BOSS把test1 和test2两位程序员叫过来 说咱程序又有新要求了 客户要求换数据库了 咱不用 sqlserver2014了 用oracle 你俩改改代码吧
test1 我草 我是mssql 你要改plsql 我数据层的sql语句和DBHelpher都是只支持mssql的 这不是让我大改嘛 好嘛 老板咋说咱就咋改吧  苦逼的开始改动中了........
test2 窃喜 我是orm框架的 支持多数据库 迁移完全没问题

如果打开你最近的程序 看看DAL代码 你肯定会看到很多近似的通用的模式 们以保存对象的方法为例 传入一个对象 SqlCommand对象添加SqlParameter,把所有属性和对象对应 置SqlCommand的CommandText属性为存储过程 后运行SqlCommand 于每个对象都要重复的写这些代码  除此之外,还有更好的办法吗?有,引入一个ORM上,一个ORM成DAL 其自己写DAL代码,不如用O/R Mapping
你用ORM删除,读取对象,ORM成SQL,你只需要关心对象就好

目前流行的 ORM 产品
目前众多厂商和开源社区都提供了持久层框架的实现,常见的有:  Java系列:  Apache OJB ()  Cayenne ()  Jaxor ()  Hibernate ()  iBatis ()  jRelationalFramework ()  mirage ()  SMYLE ()  TopLink ()  其中 TopLink 是 Oracle 的商业产品,其他均为开源项目。

Hibernate 大名鼎鼎大家都晓得吧 不过这些咱不能一一都举例 咱就拿.NET自己的EF说事



[ 本帖最后由 wangnannan 于 2015-8-6 11:22 编辑 ]
搜索更多相关主题的帖子: 程序员 Object 
2015-08-06 11:21
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:0 
总结一下 我借用网上的话
拿PHP来比较
ORM的四个核心理念来认识它:

· 简单:ORM以最基本的形式建模数据。比如ORM会将MySQL的一张表映射成一个PHP类(模型)其它数据库也一样,表的字段就是这个类的成员变量

· 精确:ORM使所有的MySQL数据表都按照统一的标准精确地映射成PHP类,使系统在代码层面保持准确统一 (自动生成的 能不工整嘛)

· 易懂:ORM使数据库结构文档化。比如MySQL数据库就被ORM转换为了PHP程序员可以读懂的PHP类,PHP程序员可以只把注意力放在他擅长的PHP层面(当然能够熟练掌握MySQL更好 这事肯定的 不能自废武功)

· 易用:ORM的避免了不规范、冗余、风格不统一的SQL语句,可以避免很多人为Bug,方便编码风格的统一和后期维护 (这话有一点点片面 简单SQL还可以 负责呢  优化EF5之前还不好说 EF 6 7应该已经解决这个问题了 而且支持存储过程 )

出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2015-08-06 13:17
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:0 
缺点就不说了 有优点就有缺点 重要的是要学会扬长避短 结合使用

出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2015-08-06 13:21
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:0 
(二) EF
Entity Framework的全称是 Entity Framework,是微软开发的基于的ORM(Object/Relational Mapping)框架。
图片附件: 游客没有浏览图片的权限,请 登录注册

Entity Framework技术是通过SSDL(Storage Schema Definition Language)、CSDL(Conceptual Schema Definition Language)和MSL(Mapping Concept and Storage Schema Language)三层映射语言来实现对象-关系映射的


[ 本帖最后由 wangnannan 于 2015-8-6 13:35 编辑 ]

出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2015-08-06 13:27
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:0 
什么意思 人家底层的就是这么说的 先恶补一下理论  
SSDL(Store Schema Definition Language,存储架构定义语言)面向关系,定义数据库对象的架构信息,包括表结构、主外键信息,以及存储过程等。该部分内容根据不同的数据库,会有 一定的差异。Membership.edmx文件中SSDL部分的内容如下:
程序代码:
<edmx:StorageModels>

 2   <Schema Namespace="MembershipModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2008" xmlns:store="http://schemas." xmlns="http://schemas.">

 3     <EntityContainer Name="MembershipModelStoreContainer">

 4       <EntitySet Name="Role" EntityType="MembershipModel.Store.Role" store:Type="Tables" Schema="dbo" />

 56       <AssociationSet Name="FK_Role_Role" Association="MembershipModel.Store.FK_Role_Role">

 7         <End Role="Parent" EntitySet="Role" />

 8         <End Role="Children" EntitySet="Role" />

 9       </AssociationSet>
1011     </EntityContainer>
12     <EntityType Name="Role">
13       <Key>
14         <PropertyRef Name="ID" />
15       </Key>
16       <Property Name="ID" Type="uniqueidentifier" Nullable="false" />
17       <Property Name="Name" Type="nvarchar" Nullable="false" MaxLength="40" />
18       <Property Name="ParentID" Type="uniqueidentifier" />
19 </EntityType>
2021     <Association Name="FK_Role_Role">
22       <End Role="Parent" Type="MembershipModel.Store.Role" Multiplicity="0..1" />
23       <End Role="Children" Type="MembershipModel.Store.Role" Multiplicity="*" />
24       <ReferentialConstraint>
25         <Principal Role="Parent">
26           <PropertyRef Name="ID" />
27         </Principal>
28         <Dependent Role="Children">
29           <PropertyRef Name="ParentID" />
30         </Dependent>
31       </ReferentialConstraint>
32 </Association>
3334   </Schema>
35 </edmx:StorageModels>


出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2015-08-06 13:37
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:0 
二、CSDL
CSDL(Conceptual Schema Definition Language,概念架构定义语言)面向对象,定义概念层实体对象的架构信息,包括实体属性信息及实体间的引用关系。该部分不关心下层所使用的数据库类 型,内容始终保持一致。CSDL部分的内容如下:
程序代码:
<edmx:ConceptualModels>

 2   <Schema Namespace="MembershipModel" Alias="Self" xmlns:annotation="http://schemas." xmlns="http://schemas.">

 3     <EntityContainer Name="Membership" annotation:LazyLoadingEnabled="true">

 4       <EntitySet Name="Roles" EntityType="MembershipModel.Role" />

 56       <AssociationSet Name="FK_Role_Role" Association="MembershipModel.FK_Role_Role">

 7         <End Role="Parent" EntitySet="Roles" />

 8         <End Role="Children" EntitySet="Roles" />

 9       </AssociationSet>
1011     </EntityContainer>
12     <EntityType Name="Role">
13       <Key>
14         <PropertyRef Name="ID" />
15       </Key>
16       <Property Name="ID" Type="Guid" Nullable="false" />
17       <Property Name="Name" Type="String" Nullable="false" MaxLength="40" Unicode="true" FixedLength="false" />
18       <Property Name="ParentID" Type="Guid" />
19       <NavigationProperty Name="Parent" Relationship="MembershipModel.FK_Role_Role" FromRole="Children" ToRole="Parent" />
20       <NavigationProperty Name="Children" Relationship="MembershipModel.FK_Role_Role" FromRole="Parent" ToRole="Children" />
2122     </EntityType>
2324     <Association Name="FK_Role_Role">
25       <End Role="Parent" Type="MembershipModel.Role" Multiplicity="0..1" />
26       <End Role="Children" Type="MembershipModel.Role" Multiplicity="*" />
27       <ReferentialConstraint>
28         <Principal Role="Parent">
29           <PropertyRef Name="ID" />
30         </Principal>
31         <Dependent Role="Children">
32           <PropertyRef Name="ParentID" />
33         </Dependent>
34       </ReferentialConstraint>
35 </Association>


出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2015-08-06 13:39
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:0 
由上面的代码示例可以看出,CSDL的内容与SSDL其实很类似,主要包括实体容器和实体引用关系两部分。所不同的是,CSDL是针对具体某种数据库的E-R模型进行定义,而CSDL则是针对抽象的实体概念模型进行定义。

出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2015-08-06 13:40
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:0 
三、MSL

MSL(Mapping Specification Language,映射规范语言)实现SSDL和CSDL之间的映射,包括表与实体的映射、字段与属性的映射,以及外键与引用的映射等。Membership.edmx文件中MSL部分的内容如下:

出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2015-08-06 13:42
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:0 
这个大概了解一下就行 第二帖开始实战


[ 本帖最后由 wangnannan 于 2015-8-6 13:43 编辑 ]

出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2015-08-06 13:42
快速回复:摆脱ADO.NET瓶颈 手把手教你学习EF6到EF7(一)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.040864 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved