[hystar整理]Entity Framework 教程 续一

2024-02-29 02:58

本文主要是介绍[hystar整理]Entity Framework 教程 续一,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

EDM之CSDL     CSDL定义了EDM或者说是整个程序的灵魂部分 – 概念模型。当前流行的软件设计方法通常都是由设计其概念模型起步。说概念模型可能比较抽象一个更容易接受的名字就是实体类。实体类是面向对象设计中一个最根本的组成部分,其体现了现实世界中对象作为一种计算中可以表示的对象设计方法。而EDM的CSDL就是要达到这样一个目的。这个在下文介绍Entity Framework优点时另有说明。 
    这个文件完全以程序语言的角度来定义模型的概念。即其中定义的实体、主键、属性、关联等都是对应于.NET Framework中的类型。下面xml element来自作业提交系统(有删节): 
<!-- CSDL content --> 
<edmx:ConceptualModels> 
<Schema Namespace="ASSModel" Alias="Self" xmlns="http://schemas.microsoft.com/ado/2006/04/edm"> 
<EntityContainer Name="ASSEntities"> 
<FunctionImport Name="GETHOUSEWORKDONE" EntitySet="UpAssignments" ReturnType="Collection(Self.UpAssignments)"> 
<Parameter Name="StuID" Type="Int32" Mode="In" /> 
<Parameter Name="ClassID" Type="Int32" Mode="In" /> 
<Parameter Name="Semester" Type="String" Mode="In" /> 
</FunctionImport> 
<!-- 以上删节 – 5个存储过程 --> 
 
<EntitySet Name="Assignments" EntityType="ASSModel.Assignments" /> 
<EntitySet Name="Classes" EntityType="ASSModel.Classes" /> 
<EntitySet Name="Courses" EntityType="ASSModel.Courses" /> 
<EntitySet Name="SetCourses" EntityType="ASSModel.SetCourses" /> 
<EntitySet Name="Students" EntityType="ASSModel.Students" /> 
<EntitySet Name="Teachers" EntityType="ASSModel.Teachers" /> 
<EntitySet Name="UpAssignments" EntityType="ASSModel.UpAssignments" /> 
 
<AssociationSet Name="FK_SetCourses_Classes" Association="ASSModel.FK_SetCourses_Classes"> 
<End Role="Classes" EntitySet="Classes" /> 
<End Role="SetCourses" EntitySet="SetCourses" /> 
</AssociationSet> 
<!-- 以上删节 – 6个关系集 --> 
 
</EntityContainer> 
 
<!-- 以下保留一个EntityType作为示例 --> 
<EntityType Name="Students"> 
<Key> 
<PropertyRef Name="StuID" /> 
</Key> 
<Property Name="StuID" Type="Int32" Nullable="false" /> 
<Property Name="StuName" Type="String" Nullable="false" MaxLength="10" Unicode="true" FixedLength="true" /> 
<Property Name="Pswd" Type="String" Nullable="false" MaxLength="50" Unicode="false" FixedLength="true" /> 
<NavigationProperty Name="Classes" Relationship="ASSModel.FK_Students_Classes" FromRole="Students" ToRole="Classes" /> 
<NavigationProperty Name="UpAssignments" Relationship="ASSModel.FK_UpAssignments_Students" FromRole="Students" ToRole="UpAssignments" /> 
</EntityType> 
 
<!-- 仅保留与上文AssociationSet对应的Association --> 
<Association Name="FK_SetCourses_Classes"> 
<End Role="Classes" Type="ASSModel.Classes" Multiplicity="1" /> 
<End Role="SetCourses" Type="ASSModel.SetCourses" Multiplicity="*" /> 
</Association> 
</Schema> 
</edmx:ConceptualModels>
这部分XML文档,Schema是CSDL的根元素,其中定义的Namespace是用于ObjectContext与EntityClass的命名空间,Alias-别名为此命名空间Namespace指定一个易记的名称,在定义Alias之后,在此Schema内的Element均可以该Alias作为Namespace的别名。Alias的使用可以参考如下xml element: 
<FunctionImport Name="GETHOUSEWORKDONE" EntitySet="UpAssignments" ReturnType="Collection( Self.UpAssignments )">
在这个根元素的内部的文档结构第一部分 – 实体容器大致如下: 
<EntityContainer /> 
<FunctionImport /> 
<EntitySet /> 
<AssociationSet /> 
</EntityContainer>
下面的表格说明了这些节点及其属性的作用 
EntityContainer
 Name
EntityContainer的名称,其将作为产生的ObjectContext类的名称
 EntitySet
 Name
ObjectContext内与此Entity类型对应的属性名
EntityType
ObjectContext内与此Entity类型对应的属性的类型
AssociationSet
  End
有两个End子节点,分别描述建立此关系的两个EntitySet
 Role
对应到Association中End节的Role属性,起到将AssociationSet与Association相关连的作用。
 FunctionImport
详见存储过程设计部分
可以看出,Entity与Assciation都被分开定义与两个部分,这样设计是出于当有多个EntityContainer时,其中的EntitySet或AssociationSet可以共享Entity或Association的定义。 
    接下来看一下CSDL中最后一部分,Entity与Association的定义。 
首先是Entity: 
<EntityType Name="Students"> 
<Key> 
<PropertyRef Name="StuID" /> 
</Key> 
<Property Name="StuID" Type="Int32" Nullable="false" /> 
<Property Name="StuName" Type="String" Nullable="false" MaxLength="10" Unicode="true" FixedLength="true" /> 
<Property Name="Pswd" Type="String" Nullable="false" MaxLength="50" Unicode="false" FixedLength="true" /> 
<NavigationProperty Name="Classes" Relationship="ASSModel.FK_Students_Classes" FromRole="Students" ToRole="Classes" /> 
<NavigationProperty Name="UpAssignments" Relationship="ASSModel.FK_UpAssignments_Students" FromRole="Students" ToRole="UpAssignments" /> 
</EntityType> 
下表说明了其属性及其子节点与子节点的属性的含义: 
 
 
 
 
 
 
 
 
 
 
EntityType
 Name
Entity Class的名称
Abstract
是否为抽象类
BaseType
父类
 Key
主键
 Property
主键之属性
Name
属性名
Property
属性
Name
属性名
Type
属性类型
Nullable
是否允许null
MaxLength
属性最大长度
FixLength
是否固定长度
NavigationProperty
关系属性
Name
属性名
Relationship
对应的Association
FromRole、ToRole
区别关系两方的父与子
 
最后Association节,这是真正定义关系的地方。首先看示例: 
<!-- 仅保留与上文AssociationSet对应的Association --> 
<Association Name="FK_SetCourses_Classes"> 
<End Role="Classes" Type="ASSModel.Classes" Multiplicity="1" /> 
<End Role="SetCourses" Type="ASSModel.SetCourses" Multiplicity="*" /> 
</Association> 
这一节符合以下结构: 
<Association> 
<End /> 
<ReferentialConstraint> 
<Principal> 
<PropertyRef /> 
</Principal> 
<Dependent> 
<PropertyRef /> 
</Dependent> 
</ReferentialConstraint> 
</Association>
属性及其子元素属性的说明: 
 
 
Association
 Name
Association的名称
 End
类似于AssociationSet,Association也有两个End节点。
Name
End名称
Type
EntityType的名称
Role
此End的Role,与AssociationSet的End的Role属性相联系
Multiplicity
关联多重性,值为0、1或*
ReferentialConstraint
外键条件限制
 Principal
主要条件
Role
对应于End中的Role
 PropertyRef
外键属性
Name
属性名称
Dependent
依存条件
Role
对应于End中的Role
 PropertyRef
外键属性
Name
属性名
 
另外上面示例未涉及的概念,如下: 
视图 
    在EDM设计器中添加视图基本与添加实体表一致,所生成的xml自行对照。某些环境下可能无法添加视图,原因未知,另外对于没有主键的表目前版本EntityFramework支持不好,在设计器中无法添加,及时通过手工编辑xml的方式强行添加,在使用过程中也会出现问题。 
ComplexType(复杂类型) 
按MSDN中的例子,先描述如下场景。在一个销售系统中我们需要在一个订单中包含一个描述客户地址的实体,而这个实体又能良好的与存储模型映射起来,由于数据库不支持地址这种类型,所以我们可以将地址的每个字段与数据库相映射。且在概念模型中,及在C#代码可以控制的范围内,地址仍然作为一个独立的类型存在。由于EDM设计器不支持以可视化方式创建Complex Type,我们需要手动编辑CSDL与MSL来完成复杂类型的创建与映射。这部分示例将在介绍MSL后给出。 
 
EDM之SSDL 这个文件中描述了表、列、关系、主键及索引等数据库中存在的概念。 
<!-- SSDL content --> 
<edmx:StorageModels> 
<Schema Namespace="ASSModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2008" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2006/04/edm/ssdl"> 
<EntityContainer Name="ASSModelStoreContainer"> 
<EntitySet Name="Assignments" EntityType="ASSModel.Store.Assignments" store:Type="Tables" Schema="dbo" /> 
<!-- 省略7个EntitySet的定义 --> 
</EntityContainer> 
 
<!-- 以下省略7个EntityType的定义 --> 
<EntityType Name="Assignments"> 
<Key> 
<PropertyRef Name="AssID" /> 
</Key> 
<Property Name="AssID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" /> 
<Property Name="AssName" Type="nchar" Nullable="false" MaxLength="20" /> 
<Property Name="AssDes" Type="nvarchar" MaxLength="500" /> 
<Property Name="SCID" Type="int" Nullable="false" /> 
<Property Name="Deadline" Type="datetime" Nullable="false" /> 
<Property Name="QuesFileName" Type="nvarchar" MaxLength="500" /> 
<Property Name="QuesFileUrl" Type="nvarchar" Nullable="false" MaxLength="500" /> 
</EntityType> 
 
<!-- 保留与CSDL中对应的Function --> 
<Function Name="GETHOUSEWORKDONE" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo"> 
<Parameter Name="StuID" Type="int" Mode="In" /> 
<Parameter Name="ClassID" Type="int" Mode="In" /> 
<Parameter Name="Semester" Type="varchar" Mode="In" /> 
</Function> 
 
</Schema> 
</edmx:StorageModels>
看文档的结构,SSDL与CSDL很详细,只是其中EntityType等使用数据库的概念的描述。 
这其中有一个需要稍微介绍节点,DefiningQuery,首先看一下其出现的位置: 
EntityContainer
  EntitySet
  DefiningQuery
通过查询定义一个SSDL的EntitySet
 特定于存储的查询语句
DefiningQuery定义通过实体数据模型 (EDM) 内的客户端投影映射到数据存储视图的查询。此类映射是只读的。也就是说如果想要更新此类EntitySet,需要使用下文介绍存储过程时提到的定义更新实体的存储过程的方法,使用定义的存储过程来更新这样的EntitySet。当在实体类设计器中导入无主键的表时,会自动生成此类使用DefiningQuery定义的EntitySet,要式样Entity Framework提供的自动更新服务而不定义存储过程,需要给数据表添加一个适当的主键,删除DefiningQuery节点并更新数据模型。 

这篇关于[hystar整理]Entity Framework 教程 续一的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/757372

相关文章

Python虚拟环境终极(含PyCharm的使用教程)

《Python虚拟环境终极(含PyCharm的使用教程)》:本文主要介绍Python虚拟环境终极(含PyCharm的使用教程),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录一、为什么需要虚拟环境?二、虚拟环境创建方式对比三、命令行创建虚拟环境(venv)3.1 基础命令3

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

python连接本地SQL server详细图文教程

《python连接本地SQLserver详细图文教程》在数据分析领域,经常需要从数据库中获取数据进行分析和处理,下面:本文主要介绍python连接本地SQLserver的相关资料,文中通过代码... 目录一.设置本地账号1.新建用户2.开启双重验证3,开启TCP/IP本地服务二js.python连接实例1.

Python 安装和配置flask, flask_cors的图文教程

《Python安装和配置flask,flask_cors的图文教程》:本文主要介绍Python安装和配置flask,flask_cors的图文教程,本文通过图文并茂的形式给大家介绍的非常详细,... 目录一.python安装:二,配置环境变量,三:检查Python安装和环境变量,四:安装flask和flas

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Ubuntu中远程连接Mysql数据库的详细图文教程

《Ubuntu中远程连接Mysql数据库的详细图文教程》Ubuntu是一个以桌面应用为主的Linux发行版操作系统,这篇文章主要为大家详细介绍了Ubuntu中远程连接Mysql数据库的详细图文教程,有... 目录1、版本2、检查有没有mysql2.1 查询是否安装了Mysql包2.2 查看Mysql版本2.

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3