本文主要是介绍[hystar整理]Entity Framework 教程 续二,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
EDM之MSL 这个文件即上面所述的CSDL与SSDL的对应,主要包括CSDL中属性与SSDL中列的对应。
<!-- C-S mapping content -->
<edmx:Mappings>
<Mapping Space="C-S" xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS">
<EntityContainerMapping StorageEntityContainer="ASSModelStoreContainer" CdmEntityContainer="ASSEntities">
<EntitySetMapping Name="Assignments">
<EntityTypeMapping TypeName="IsTypeOf(ASSModel.Assignments)">
<MappingFragment StoreEntitySet="Assignments">
<ScalarProperty Name="QuesFileName" ColumnName="QuesFileName" />
<ScalarProperty Name="AssDes" ColumnName="AssDes" />
<ScalarProperty Name="AssID" ColumnName="AssID" />
<ScalarProperty Name="AssName" ColumnName="AssName" />
<ScalarProperty Name="Deadline" ColumnName="Deadline" />
<ScalarProperty Name="QuesFileUrl" ColumnName="QuesFileUrl" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
<!-- 省略EntitySetMapping若干 -->
<!-- 保留对应于CSDL与SSDL的FunctionImportMapping -->
<FunctionImportMapping FunctionImportName="GETHOUSEWORKDONE" FunctionName="ASSModel.Store.GETHOUSEWORKDONE" />
<AssociationSetMapping Name="FK_UpAssignments_Assignments" TypeName="ASSModel.FK_UpAssignments_Assignments" StoreEntitySet="UpAssignments">
<EndProperty Name="Assignments">
<ScalarProperty Name="AssID" ColumnName="AssID" />
</EndProperty>
<EndProperty Name="UpAssignments">
<ScalarProperty Name="UpAssID" ColumnName="UpAssID" />
</EndProperty>
</AssociationSetMapping>
<!-- 省略AssociationSetMapping若干 -->
</EntityContainerMapping>
</Mapping>
</edmx:Mappings>
如上代码所示,MSL的根节点为Mapping,其中可以包含多个EntityContainerMapping(上例只有一个),每一个EntityContainerMapping对应着两个分别来自CSDL与SSDL的EntityContainer。这个EntityContainerMapping就是描述这两个EntityContainer间的对应。下面再给出一段代码展示EntityContainerMapping的基本格式。
<EntityContainerMapping StorageEntityContainer="" CdmEntityContainer="">
<EntitySetMapping>
<EntityTypeMapping>
<MappingFragment>
<ScalarProperty />
</MappingFragment>
<ModificationFunctionMapping>
<InsertFunction />
<DeleteFunction />
<UpdateFunction />
</ ModificationFunctionMapping>
</EntityTypeMapping>
</EntitySetMapping>
<AssociationSetMapping>
<EndProperty>
<ScalarProperty />
</EndProperty>
</AssociationSetMapping>
<FunctionImportMapping />
</EntityContainerMapping>
同上文,下面列出这些节点的属性
EntityContainerMapping
StorageEntityContainer
SSDL中的EntityContainer名称
CdmEntityContainer
CSDL中的EntityContainer名称
EntitySetMapping
EntityContainer中每个EntitySet的对应
Name
EntitySetMapping的名称
EntityTypeMapping
描述CSDL中EntityType与SSDL中EntityType的对应
Name
EntityTypeMapping的名称
TypeName
对应CSDL内Entity的名称 – 格式:IsTypeOf(<名称>)
注:这个类及其子类将共享此EntityTypeMapping
MappingFragment
描述属性及字段间的对应
StoreEntitySet
SSDL中的EntitySet名称
(由于CSDL中一个EntitySet可以对应多个SSDL中的EntitySet)
ScalarProperty
属性与字段对应
Name
CSDL中的属性名
ColumnName
SSDL中的字段名称
Condition
详见说明2
ColumnName
列名
Value
值
ModificationFunctionMapping
CUD对应的存储过程
InsertFunction/ UpdateFunction / DeleteFunction
FunctionName
QueryView
Entity SQL
AssociationSetMapping
描述CSDL中的AssociationSet与SSDL中的EntitySet的对应关系
Name
AssociationSetMapping的名称
StoreEntitySet
SSDL中EntitySet的名称
TypeName
CSDL中AssociationSet的名称
EndProperty
一个AssociationSetMapping中有两个EndProperty
分别对应CSDL中两个End Role
Name
EndProperty的名称
ScalarProperty
关系属性对应
Name
CSDL中的属性名
ColumnName
SSDL中的字段名称
ModificationFunctionMapping
C/D对应的存储过程
InsertFunction/ DeleteFunction
FunctionName
QueryView
EntitySQL
FunctionImportMapping
用于描述CSDL与SSDL间函数及函数参数的对应(详见下文存储过程部分)
说明1 :以上表中很重要的一个属性是MappingFragment中的StoreEntitySet属性,就像这个属性的说明中所说,其描述了CSDL的Entity对应到的SSDL的Entity的名称。这是实现下文EDM映射方案中第二条将一个概念模型的实体映射到多个存储模型的实体的关键设置。
说明2 :Contain这个元素及其属性的作用是,当多个概念模型实体映射到一个存储模型实体时,该元素的属性决定了在什么情况下一个概念模型实体映射到指定的存储模型实体。
说明3 :QueryView 元素定义概念模型中的实体与存储模型中的实体之间的只读映射。使用根据存储模型计算的 Entity SQL 查询定义此查询视图映射,并以概念模型中的实体表达结果集。同DefiningQuery定义的查询。此映射也是只读的。就是说如果想要更新此类EntitySet,也需要使用下文介绍存储过程时提到的定义更新实体的存储过程的方法,使用定义的存储过程来更新这样的EntitySet。当多对多关联在存储模型中所映射到的实体表示关系架构中的链接表时,必须为此链接表在AssociationSetMapping 元素中定义一个QueryView元素。定义查询视图时,不能在 AssociactionSetMapping 元素上指定 StorageSetName 属性。定义查询视图时,AssociationSetMapping 元素不能同时包含 EndProperty 映射。
EDM中存储过程的设计 目前版本(VS2008SP1)的实体设计器对存储过程支持不完善,只能手工编辑这三个文件中的存储过程部分,包括:
EntitySetMapping
EntityContainer中每个EntitySet的对应
EntityTypeMapping
描述CSDL中EntityType与SSDL中EntityType的对应
ModificationFunctionMapping
CUD对应的存储过程
InsertFunction/ UpdateFunction / DeleteFunction
FunctionName
AssociationSetMapping
描述CSDL中的AssociationSet与SSDL中的EntitySet的对应关系
ModificationFunctionMapping
C/D对应的存储过程
InsertFunction/ DeleteFunction
FunctionName
EDM中ComplexType的设计 再谈Complex Type,上文大致介绍了复杂类型的概念及作用,现在开始看一下具体怎样实现。前文已经提到实现复杂类型关键是在CSDL与MSL,而与SSDL无关。
首先应该在CSDL中怎加这样一节,此节与<EntityType></EntityType>节同级,其结构如下:
<ComplexType>
<Property />
</ComplexType>
节点及其属性含义如下:
ComplexType
复杂类型
Name
复杂类型的名称
Property
属性
Name
属性名
Type
属性类型
Nullable
是否允许null
MaxLength
属性最大长度
FixLength
是否固定长度
然后在MSL中<MappingFragment>下与<ScalarProperty />同级的位置添加如下节:
<ComplexProperty>
<ScalarProperty />
</ComplexProperty>
具体的节及其属性含义如下:
ComplexProperty
复杂类型属性
Name
复杂类型属性名称
TypeName
CSDL中定义的ComplexType的名称。格式"CSDN_Namespace.ComplexTypeName"
ScalarProperty
关系属性对应
Name
CSDL中的属性名
ColumnName
SSDL中的字段名称
实体数据模型映射方案 实体框架支持各种方式用于在实体数据模型 (EDM) 中将概念模型映射到关系数据。有关更多信息,请参见 实体框架中的数据建模 。
实体框架当前支持以下实体数据模型 (EDM) 映射方案。
编号
映射方案
说明
1
简单映射
在此映射方案中,概念模型中的每个实体都映射到存储模型中的单个表。这是实体数据模型工具所生成的默认映射。
2
实体拆分
在此映射方案中,概念模型中单个实体的属性映射到两个或更多基础表中的列。在此方案中,表必须共享公共主键。
其设计方式见EDM之MSL部分说明1。
3
存储模型中的水平分区
在此映射方案中,概念模型中的单个实体类型映射到具有相同架构的两个或更多表。实体基于概念模型中定义的条件映射到表中。
使用场合:使一个概念模型的实体映射到不同数据源的存储模型的实体。
另见:EDM之MSL部分说明2。
4
概念模型中的水平分区
在此映射方案中,概念模型中具有相同属性的多个实体类型映射到同一个表。条件子句用于指定表中的数据分别属于哪个实体类型。此映射类似于类型5。
这种方式也用到MSL中的Conditon来决定映射关系,见EDM之MSL部分说明2。
5
每个层次结构一个表继承
在此映射方案中,继承层次结构中的所有类型都映射到同一个表。条件子句用于定义实体类型。
见EDM之MSL部分说明2。
6
每种类型一个表继承
在此映射方案中,所有类型都分别映射到各自的表。仅属于某个基类型或派生类型的属性存储在映射到该类型的一个表中。
7
每种具体类型一个表继承
在此映射方案中,每个非抽象类型分别映射到不同的表。所有这些表所包含的列必须映射到派生类型的所有属性(包括从基类型继承的属性)。
8
每种类型多个实体集
在此映射方案中,单个实体类型在概念模型中以两个或更多独立的实体集进行表示。每个实体集分别映射到存储模型中的一个单独的表。
其设计方式见EDM之MSL部分说明1。
9
复杂类型
复杂类型是没有键属性的实体类型的非标量属性。复杂类型可以包含其他嵌套的复杂类型。复杂类型映射到存储模型中的表。
复杂类型在上文有单独介绍
10
函数导入映射
在此方案中,存储模型中的存储过程映射到概念模型中的 FunctionImport 元素。执行此函数可使用映射的存储过程返回实体数据。
见上文存储过程部分
11
修改函数映射
在此方案中,在存储模型中定义用于插入、更新和删除数据的存储过程。这些函数是为实体类型定义的,以便为特定实体类型提供更新功能。
见上文存储过程部分
12
定义查询映射
在此方案中,在存储模型中定义表示数据源中的表的查询。在映射到 SQL Server 数据库时,查询以数据源的本机查询语言(如 Transact-SQL)表示。此 DefiningQuery 元素映射到概念模型中的实体类型。查询以特定于存储的查询语言进行定义。
上文EDM之SSDL部分最后详细介绍了这种设计的相关问题
13
查询视图映射
在此方案中,会在概念模型中的实体类型与存储模型中的关系表之间定义只读映射。此映射基于对存储模型进行的 Entity SQL 查询定义。
上文EDM之MSL中说明三对这种设计的相关问题有介绍。
14
AssociationSet 映射
关联定义实体之间的关系。在具有一对一或一对多关联的简单映射中,在概念模型中定义关系的关联会映射到存储模型中的关联。还支持以下更高级的关联集映射:
多对多关联。关联的两端都映射到存储模型中的链接表。
自关联。此映射支持具有相同类型的两个实体之间的关联,如一个 Employee 与另一个 Employee 之间的关联。
派生类型之间的关联。此映射支持一个层次结构中的派生类型与另一个层次结构中的派生类型之间的关联。
<!-- C-S mapping content -->
<edmx:Mappings>
<Mapping Space="C-S" xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS">
<EntityContainerMapping StorageEntityContainer="ASSModelStoreContainer" CdmEntityContainer="ASSEntities">
<EntitySetMapping Name="Assignments">
<EntityTypeMapping TypeName="IsTypeOf(ASSModel.Assignments)">
<MappingFragment StoreEntitySet="Assignments">
<ScalarProperty Name="QuesFileName" ColumnName="QuesFileName" />
<ScalarProperty Name="AssDes" ColumnName="AssDes" />
<ScalarProperty Name="AssID" ColumnName="AssID" />
<ScalarProperty Name="AssName" ColumnName="AssName" />
<ScalarProperty Name="Deadline" ColumnName="Deadline" />
<ScalarProperty Name="QuesFileUrl" ColumnName="QuesFileUrl" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
<!-- 省略EntitySetMapping若干 -->
<!-- 保留对应于CSDL与SSDL的FunctionImportMapping -->
<FunctionImportMapping FunctionImportName="GETHOUSEWORKDONE" FunctionName="ASSModel.Store.GETHOUSEWORKDONE" />
<AssociationSetMapping Name="FK_UpAssignments_Assignments" TypeName="ASSModel.FK_UpAssignments_Assignments" StoreEntitySet="UpAssignments">
<EndProperty Name="Assignments">
<ScalarProperty Name="AssID" ColumnName="AssID" />
</EndProperty>
<EndProperty Name="UpAssignments">
<ScalarProperty Name="UpAssID" ColumnName="UpAssID" />
</EndProperty>
</AssociationSetMapping>
<!-- 省略AssociationSetMapping若干 -->
</EntityContainerMapping>
</Mapping>
</edmx:Mappings>
如上代码所示,MSL的根节点为Mapping,其中可以包含多个EntityContainerMapping(上例只有一个),每一个EntityContainerMapping对应着两个分别来自CSDL与SSDL的EntityContainer。这个EntityContainerMapping就是描述这两个EntityContainer间的对应。下面再给出一段代码展示EntityContainerMapping的基本格式。
<EntityContainerMapping StorageEntityContainer="" CdmEntityContainer="">
<EntitySetMapping>
<EntityTypeMapping>
<MappingFragment>
<ScalarProperty />
</MappingFragment>
<ModificationFunctionMapping>
<InsertFunction />
<DeleteFunction />
<UpdateFunction />
</ ModificationFunctionMapping>
</EntityTypeMapping>
</EntitySetMapping>
<AssociationSetMapping>
<EndProperty>
<ScalarProperty />
</EndProperty>
</AssociationSetMapping>
<FunctionImportMapping />
</EntityContainerMapping>
同上文,下面列出这些节点的属性
EntityContainerMapping
StorageEntityContainer
SSDL中的EntityContainer名称
CdmEntityContainer
CSDL中的EntityContainer名称
EntitySetMapping
EntityContainer中每个EntitySet的对应
Name
EntitySetMapping的名称
EntityTypeMapping
描述CSDL中EntityType与SSDL中EntityType的对应
Name
EntityTypeMapping的名称
TypeName
对应CSDL内Entity的名称 – 格式:IsTypeOf(<名称>)
注:这个类及其子类将共享此EntityTypeMapping
MappingFragment
描述属性及字段间的对应
StoreEntitySet
SSDL中的EntitySet名称
(由于CSDL中一个EntitySet可以对应多个SSDL中的EntitySet)
ScalarProperty
属性与字段对应
Name
CSDL中的属性名
ColumnName
SSDL中的字段名称
Condition
详见说明2
ColumnName
列名
Value
值
ModificationFunctionMapping
CUD对应的存储过程
InsertFunction/ UpdateFunction / DeleteFunction
FunctionName
QueryView
Entity SQL
AssociationSetMapping
描述CSDL中的AssociationSet与SSDL中的EntitySet的对应关系
Name
AssociationSetMapping的名称
StoreEntitySet
SSDL中EntitySet的名称
TypeName
CSDL中AssociationSet的名称
EndProperty
一个AssociationSetMapping中有两个EndProperty
分别对应CSDL中两个End Role
Name
EndProperty的名称
ScalarProperty
关系属性对应
Name
CSDL中的属性名
ColumnName
SSDL中的字段名称
ModificationFunctionMapping
C/D对应的存储过程
InsertFunction/ DeleteFunction
FunctionName
QueryView
EntitySQL
FunctionImportMapping
用于描述CSDL与SSDL间函数及函数参数的对应(详见下文存储过程部分)
EDM中存储过程的设计 目前版本(VS2008SP1)的实体设计器对存储过程支持不完善,只能手工编辑这三个文件中的存储过程部分,包括:
- CSDL中的FunctionImport元素,其属性及说明如下所示:
FunctionImport
Name
(在程序中调用的)函数的名称
EntitySet
当函数返回实体对象时,需使用此属性指定对应的EntitySet
ReturnType
函数返回值的类型
Parameter
以下用于参数子节点中的属性定义
Name
参数的名称
Type
参数的类型
Mode
参数的传递方式(In, Out或InOut)
MaxLength
参数值最大长度
Precision
参数值的精确度,用于数字类型
Scale
浮点数小数位 - SSDL中的Function节
Function
Name
存储过程名称
Aggregate
是否为聚合函数(存储过程)
BuiltIn
是否为内建存储过程
NiladicFunction
是否为无参数存储过程
IsComposable
True为自定义函数,False为存储过程
ParameterTypeSemantics
参数类型转换方式
ReturnType
存储过程返回类型 - MSL中的FunctionImportMapping节
FunctionImportMapping
FunctionImportName
CSDL中FunctionImport的名称
FunctionName
SSDL中Function Element的名称
这面总结的是用于返回实体对象的查询(存储过程)。
- 使用插入、更新或删除实体数据的存储过程,需要修改如下两个文件:
SSDL,对其的修改要求与上文表中列出的一致:
MSL,需要对一下节点进行定义:
EntitySetMapping
EntityContainer中每个EntitySet的对应
EntityTypeMapping
描述CSDL中EntityType与SSDL中EntityType的对应
ModificationFunctionMapping
CUD对应的存储过程
- 使用创建或删除在数据源中使用链接表实现的实体类型之间的多对多关系的存储过程需要修改如下两个文件:
SSDL,对其的修改要求与上文表中列出的一致:
MSL,需要对一下节点进行定义:
AssociationSetMapping
描述CSDL中的AssociationSet与SSDL中的EntitySet的对应关系
ModificationFunctionMapping
C/D对应的存储过程
EDM中ComplexType的设计 再谈Complex Type,上文大致介绍了复杂类型的概念及作用,现在开始看一下具体怎样实现。前文已经提到实现复杂类型关键是在CSDL与MSL,而与SSDL无关。
首先应该在CSDL中怎加这样一节,此节与<EntityType></EntityType>节同级,其结构如下:
<ComplexType>
<Property />
</ComplexType>
节点及其属性含义如下:
ComplexType
复杂类型
Name
复杂类型的名称
Property
属性
Name
属性名
Type
属性类型
Nullable
是否允许null
MaxLength
属性最大长度
FixLength
是否固定长度
然后在MSL中<MappingFragment>下与<ScalarProperty />同级的位置添加如下节:
<ComplexProperty>
<ScalarProperty />
</ComplexProperty>
具体的节及其属性含义如下:
ComplexProperty
复杂类型属性
Name
复杂类型属性名称
TypeName
CSDL中定义的ComplexType的名称。格式
ScalarProperty
关系属性对应
Name
CSDL中的属性名
ColumnName
SSDL中的字段名称
实体数据模型映射方案 实体框架支持各种方式用于在实体数据模型 (EDM) 中将概念模型映射到关系数据。有关更多信息,请参见 实体框架中的数据建模
实体框架当前支持以下实体数据模型 (EDM) 映射方案。
编号
映射方案
说明
1
简单映射
在此映射方案中,概念模型中的每个实体都映射到存储模型中的单个表。这是实体数据模型工具所生成的默认映射。
2
实体拆分
在此映射方案中,概念模型中单个实体的属性映射到两个或更多基础表中的列。在此方案中,表必须共享公共主键。
3
存储模型中的水平分区
在此映射方案中,概念模型中的单个实体类型映射到具有相同架构的两个或更多表。实体基于概念模型中定义的条件映射到表中。
使用场合:使一个概念模型的实体映射到不同数据源的存储模型的实体。
4
概念模型中的水平分区
在此映射方案中,概念模型中具有相同属性的多个实体类型映射到同一个表。条件子句用于指定表中的数据分别属于哪个实体类型。此映射类似于类型5。
5
每个层次结构一个表继承
在此映射方案中,继承层次结构中的所有类型都映射到同一个表。条件子句用于定义实体类型。
6
每种类型一个表继承
在此映射方案中,所有类型都分别映射到各自的表。仅属于某个基类型或派生类型的属性存储在映射到该类型的一个表中。
7
每种具体类型一个表继承
在此映射方案中,每个非抽象类型分别映射到不同的表。所有这些表所包含的列必须映射到派生类型的所有属性(包括从基类型继承的属性)。
8
每种类型多个实体集
在此映射方案中,单个实体类型在概念模型中以两个或更多独立的实体集进行表示。每个实体集分别映射到存储模型中的一个单独的表。
9
复杂类型
复杂类型是没有键属性的实体类型的非标量属性。复杂类型可以包含其他嵌套的复杂类型。复杂类型映射到存储模型中的表。
10
函数导入映射
在此方案中,存储模型中的存储过程映射到概念模型中的 FunctionImport
11
修改函数映射
在此方案中,在存储模型中定义用于插入、更新和删除数据的存储过程。这些函数是为实体类型定义的,以便为特定实体类型提供更新功能。
12
定义查询映射
在此方案中,在存储模型中定义表示数据源中的表的查询。在映射到 SQL Server 数据库时,查询以数据源的本机查询语言(如 Transact-SQL)表示。此 DefiningQuery
13
查询视图映射
在此方案中,会在概念模型中的实体类型与存储模型中的关系表之间定义只读映射。此映射基于对存储模型进行的 Entity SQL 查询定义。
14
AssociationSet 映射
关联定义实体之间的关系。在具有一对一或一对多关联的简单映射中,在概念模型中定义关系的关联会映射到存储模型中的关联。还支持以下更高级的关联集映射:
多对多关联。关联的两端都映射到存储模型中的链接表。
自关联。此映射支持具有相同类型的两个实体之间的关联,如一个 Employee 与另一个 Employee 之间的关联。
派生类型之间的关联。此映射支持一个层次结构中的派生类型与另一个层次结构中的派生类型之间的关联。
这篇关于[hystar整理]Entity Framework 教程 续二的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!