C#之EF 概念篇之ORM与EF体系架构

ORM特性

在这里插入图片描述
核心原则:

  • 简单性
  • 传达性
  • 精确性

优点

  • 面向对象
     不用编码,就可以向操作对象一样操作数据库
  • 提高开发效率
    ORM可以自动对实体对象与数据库中表进行字段与属性的映射,不需要单独的数据访问层就可以对数据进行增删改查。
  • 方便转移数据库
    当数据库发生改变时,不需要对模型进行改动,只需要修改映射关系就可以 了。

缺点

  • 不够灵活,对于复杂查询,ORM力不从心。
  • 执行效率低于直接 编写的SQL语句 。
  • 性能损耗,ORM中的映射和关系管理是以牺牲性能为代价的
  • 提高了学习成本。

使用场合

  • 对性能要求不是很苛刻的程序
  • 有一个转换的成本
  • 开发时间紧迫时
  • 有数据库迁移需求时

常见ORM框架

  • NHibernate:Hibernate在.NET平台下的版本
  • Batis.NET:iBatis在.NET平台的实现
  • Linq to SQL(微软不再更新):.NET针对SQL server的ORM框架
  • ADO.NET Entity Framework:微软在.NET4.0推出的领域驱动开发模型。

EF体系结构

在这里插入图片描述

  • Data Providers
    数据库的相关操作
  • EDM(Entity Data Model实体数据模型)
    概念层和逻辑层的映射,应用程序构建在该层之上
  • 其他层
    如何操作EDM

其中最重要的是EDM层,以下重点介绍EDM的内容

EDM(Entity Data Model实体数据模型)

EDM与ORM的关系:
EF作为实现了ORM思想的框架,其核心EDM的概念与ORM的概念是非常一致的,EDM的三层非别对应了ORM思想实体,关系,映射
在这里插入图片描述

EDM的层级关系:

CSDL(概念层)

概念:
CSDL定义了EDM或者说是整个程序的灵魂部分 – 概念模型。通俗地讲就是实体类。实体类是面向对象设计中一个最根本的组成部分,其体现了现实世界中对象作为一种计算中可以表示的对象设计方法。而EDM的CSDL就是要达到这样一个目的

作用:

  • 定义对象模型,以面向对象方式访问数据
  • 负责向上的对象与属性显露与访问,说白了就是咱们建立的实体类;由概念架构定义语言文件 (.csdl)定义

XML文档介绍:
在这里插入图片描述
这部分XML文档,Schema是CSDL的根元素,其中定义的Namespace是用于ObjectContext与EntityClass的命名空间,Alias-别名为此命名空间Namespace指定一个易记的名称,在定义Alias之后,在此Schema内的Element均可用该Alias作为Namespace的别名

MSL(对应层)

概念:

  • 概念层和存储层的映射
  • 将上方的概念层和底下的储存层的数据结构对应在一起,起一个映射的作用;由映射规范语言文件 (.msl)定义
  • 管理CSDL与SSDL的对应关系,建立实体类与数据库结构的一一映射
    <!-- C-S mapping content -->
    <edmx:Mappings>
      <Mapping Space="C-S" xmlns="http://schemas.microsoft.com/ado/2009/11/mapping/cs">
        <EntityContainerMapping StorageEntityContainer="EFTestModelStoreContainer" CdmEntityContainer="EFTestEntities">
          <EntitySetMapping Name="User">
            <EntityTypeMapping TypeName="EFTestModel.User">
              <MappingFragment StoreEntitySet="User">
                <ScalarProperty Name="ID" ColumnName="ID" />
                <ScalarProperty Name="Name" ColumnName="Name" />
                <ScalarProperty Name="Sex" ColumnName="Sex" />
                <ScalarProperty Name="deptment" ColumnName="deptment" />
              </MappingFragment>
            </EntityTypeMapping>
          </EntitySetMapping>
        </EntityContainerMapping>
      </Mapping>
    </edmx:Mappings>

MSL的根节点为Mapping,其中可以包含多个EntityContainerMapping,每一个EntityContainerMapping对应着两个分别来自CSDL与SSDL的EntityContainer。这个EntityContainerMapping就是描述这两个EntityContainer间的对应

SSDL(存储层)

作用:

  • 与数据库管理系统中的数据做映射
  • 依不同数据库与数据结构,而显露出实体的数据结构体,和 Provider 一起,负责实际对数据库的访问和 SQL 的产生;由存储架构定义语言文件 (.ssdl)定义
   <!-- SSDL content --><edmx:StorageModels><Schema Namespace="EFTestModel.Store" Provider="System.Data.SqlClient" ProviderManifestToken="2008" Alias="Self" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns:customannotation="http://schemas.microsoft.com/ado/2013/11/edm/customannotation" xmlns="http://schemas.microsoft.com/ado/2009/11/edm/ssdl">        <!--生成过程中发现错误:警告 6002: 表/视图“EFTest.dbo.User”未定义主键。已推断出该键,并将定义创建为只读的表/视图。--><EntityType Name="User"><Key><PropertyRef Name="ID" /></Key><Property Name="ID" Type="varchar" MaxLength="50" Nullable="false" /><Property Name="Name" Type="varchar" MaxLength="50" /><Property Name="Sex" Type="varchar" MaxLength="50" /><Property Name="deptment" Type="varchar" MaxLength="50" /></EntityType><EntityContainer Name="EFTestModelStoreContainer"><EntitySet Name="User" EntityType="Self.User" store:Type="Tables" store:Schema="dbo"><DefiningQuery>SELECT [User].[ID] AS [ID], [User].[Name] AS [Name], [User].[Sex] AS [Sex], [User].[deptment] AS [deptment]FROM [dbo].[User] AS [User]</DefiningQuery></EntitySet></EntityContainer></Schema></edmx:StorageModels>

这个文件中描述了表、列、关系、主键及索引等数据库中存在的概念。文档的结构与CSDL很相似,只是其中EntityType等使用数据库的概念进行描述。其中有一个节点需要了解:DefiningQuery,他定义通过实体数据模型 (EDM) 内的客户端投影映射到数据存储视图的查询,就是下面文件中的查询语句

三者关系:

这三者合在一起就是EDM模式。
在这里插入图片描述
由于这个文件本质是一个xml文件,可以手工编辑此文件来自定义CSDL、MSL与SSDL这三部分。下面详细分析一下这个xml文件及三个其重要组成部分

内容摘自:
EntityFramework循循渐进

[hystar整理]Entity Framework 教程

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值