编程三大核心内容之一:数据处理
ADO.NET Entity Framework 是对象-关系映射架构,使用CSDL概念架构定义语言和SSDL存储架构定义语言给出数据库和实体类之间的映射信息。这个架构是现阶段最易使用的高层次的数据处理方案。
Visual Studio集成开发环境 自带的 实体数据模型设计器 使用.edmx文件保存信息,生成 CSDL概念架构定义语言.csdl文件、SSDL存储架构定义语言.ssdl文件和MSL映射规范语言.msl文件。
一、概念层csdl
1.杂项
实体容器:System.Data.Objects.ObjectContext , System.Data.Entity.DbContext
实体数据模型工具:Visual Studio内置映射和建模工具(Code First使用数据注释和fluent API)
实体SQL命令:EntityCommand
管理事务:System.Transaactions, EntityTransaction
基元类型:PrimitiveType –>IExtendedDataRecord obj.GetValue(index)
有结构类型:StructuralType –>
IExtendeddDataRecord record;
int count= record.DatarecordInfo.FieldMetadata.Count;
int index=0;
record.GetName(index);
if(record.IsDBNull(index) == false){
BuiltInTypeKind fieldTypeKindd = record.DataRecordInfo.FiedMetadata[index].FieldType.TypeUsage.EdmType.BuiltInTypeKind;
if(fieldTypeKind == BuiltInTypeKind.PrimitiveType) record.GetValue(index);}
地址类型:RefType –>
if(record.IsDBNull(index)==false){
if(fieldTypeKind == BuiltInTypeKind.RefType){
EntityKey key = record.GetValue(index) as EntityKey;
key.EntitySetName;
foreach( EntityKeyMember keyMember in key.EntityKeyValues){
keyMember.Key;
keyMember.Value;}}}
复杂类型:DbDataRecord –>
DbDataRecord r;
for (int i =0; i < r.FieldCount; i++) r.getValue( i );
嵌套集合:->
EntityDataReader rdr ;
rdr.Read();
DbDataReader reader = rer.GetDataReader( index);
reader.Read();
reader[“ID”];
reader[“date”];
2.实体数据模型:
实体类型、关联类型、属性
命名空间:<Schema Namespce=”” />
<Using Namespace=”” Aliass=”” />
基元类型:
Binary
Boolean
Byte
DateTime 日期和时间
DateTimeOffset 相对GMT的分钟偏移量
Decimal
Double
Float
Guid 16字节唯一标识符
Int16
Int32
Int64
SByte
String
Time 当天的时间
继承:根类型须有实体键;不支持多重继承;继承为实现继承不能改写基类。
关联:1.名称;2.两个关联端;3.关联操作。
<Association Name=””>
<End Type=”实体类型” Role=”关联端名称” Multiplicity=”*” />
<End Type=”实体类型” Multiplicity=”1”>
<OnDelete Action=”Cascade” />
</End>
</Association>
关联集:1.关联集名称;2.要包含其实例的关联;3.两个关联集端;4.同一个关联可以有多个关联集,但关联集不能共享广联集端。
<EntityContainer Nmae=”BooksContainer”> //容器
<EntitySet Name=”Books” EntityType=”BooksModel.Book” /> //实体集
<EntitySet Name=”Publishers” EntityType=”BooksModel.Author” /> //实体集
<AssociationSet Name=”PublishedBy” Association=”BooksModel.PublishedBy”> //关联集和关联
<End Role=”Book” EntitySet=”Books” /> //关联集端
<End Role=”Publisher” EntitySet=”Publishers” /> //关联集端
</AssociationSet>
</EntityContainer>
复杂类型:1.名称;2.属性;3.不能独立存在,不能参与关联
<ComplexType Name=”Adderess”>
<Property Type=”String” Name=”StreetAddress” Nullable=”false” />
<Property Type=”String” Name=”City” Nullable=”false” />
</ComplexType>
实体类型:1.必须具备实体键;2.属性;3.导航(关联)属性;4.类型和键值相同才是相等
<EntityType Nmae=”Publisher”>
<Key>
<PropertyRef Nmae=”Id” />
</Key>
<Property Type=”Int32” Name=”Id”Nullable=”false” />
<Property Type=”BooksModel.Address” Name=”Address” Nullable=”false” />
<NavigationProperty Name=”Books” Relationship=”BooksModel.Publishedby” FromRole=”Publisher” ToRole=”Book” />
</EntityType>
实体容器:1.实体集、关联集、函数导入的逻辑分组。
<EntityContainer Name=”BooksContainer” >
<EntitySet Name=”Books” EntityType=”BooksModel.Book” />
<EntitySet Name=”Publishers” EntityType=”BooksModel.Publisher”/>
<AssociationSet Name=”PublishedBy” Association=”BooksModel.PublishedBy”>
<End Role=”book” EntitySet=”Books” />>
<End Role=”Publisher” EntitySet=”Publishers” />
</AssociationSet>
</EntityContainer>
实体键:1.由一组不为null且不可变的基元类型属性组成;2.实体键必须在根类中定义
<Key>
<PropertyRef Name=”名称” />
</Key>
外键:1.当两个实体中有一个类型具有外键属性时,将使用引用完整性约束来定义两个实体类型之间的关联。
引用完整性约束:1.引用另一个实体类型的实体键的实体是依赖端;2.被引用的是主体端;3.依赖端配备一组引用主体端实体键的属性;4.在关联中定义引用完整性约束。
<Association Name=”PublishedBy”>
<End Type=”BooksModel.Book” Role=”Book” Multiplicity=”*” />
<End Type=”BooksModel.Publisher” Role=”Pbulisher” Multiplicity=”1” />
<ReferentialConstraint> //约束
<Principal Role=”Publisher”> //主体端
<PropertyRef Name=”Id” /> //主体端实体键
</Principal>
<Dependent Role=”Book”> //依赖端
<PropertyRef Name=”PublisherId” /> //依赖端属性引用主体端实体键
</Dependent>
</ReferentialConstraint>
</Asscociation>
导航(关联)属性:1.名称;2.关联;3.关联端
<NavigationProperty Name=”名称” Relationship=”关联” FromRole=”近端” ToRole=”远端” />
实体集:1.实体键在该集中唯一;2.实例不存在于其他实体集中;3.概念模型中的实体类型不必都定义实体集。
属性:1.属性名;2.属性类型;3.一组方面(细则)。
<Property Type=”类型” Name=”名称” Nullable=”方面” />
方面(细则) :
Collation 排序的序列 适用String
ConcurrencyMode 开放式并发检查
Default 默认值
FixedLength 长度是否可变 适用于Binary、String
MaxLength 最大长度 适用于Binary、String
Nullable 是否可null
Precision 位数 适用于Decimal、DateTime、DateTimeOffset、Time
Scale 小数位数 适用于Decimal
Unicode 是否存储为Unicode 适用于String
模型声明函数:在概念模型中声明,在承载或存储环境中定义。
<FunctionImport Name=”UpdatePublisher”>
<Parameter Nmae=”PublilsherId” Mode=”In” Type=”Int32” />
<Parameter Name=”PblisherName” Mode=”In” Type=”String” />
</FunctionImport>
模型定义函数:用Entity SQl定义。
<Function Name=”GetYearsInPrint” ReturnType=”Edm.Int32”>
<Parameter Name=”book” Type=”BooksModel.Book” />
<DefiningExpression>
Year(CurrentDateTime()) – Year(case(book.PublishedDate as DateTime))
</DefiningExpression>
</Function>
3.快速参考
1 Association(关联).Name(关联名)
1.1 Documentation (文档信息)
1.1.1 Summary (简短说明)
1.1.2 LongDescription(详细说明)
1.2 End (端) .Type(实体类型) .Role(名称) .Multiplicity (重数)
1.2.1 OnDelete (定义运行时而非数据源的联动删除) .Action (是否联动删除 Cascade | None)
1.3 ReferentialConstraint (引用完整性约束)
1.3.1 Principal (主体端).Role (端名)
1.3.1.1 PropertyRef (主体端键).Name(键名)
1.3.2 Dependent (依赖端).Role(端名)
1.3.2.1 PropertyRef .Name
1.4 批注元素
2 AssocictionSet (关联集).Name(关联集名称) .Association(关联类型)
2.1 End .EntitySet(实体集) .Role(端名)
3 Function (函数) .Name (函数名) .ReturnType (返回类型)
3.1 Parameter (参数) .Name(参数名) .Type(基元类型|实体类型|复杂类型|行类型|引用类型) .Mode(In | Out | InOut) .MaxLength(最大长度) .Precision(精度) .Scale(小数位数) .Nullable(是否可null) .DefaultValue(默认值) .FixedLength(是否固定长度) .Unicode (是否Unicode) .Collation(排序序列字符串)
3.2 DefiningExpression (实体SQL)
3.3 ReturnType (返回类型).ReturnType(返回类型)
3.3.1 CollectionType(集合类型) .Type(类型) .Nullable .DefaultValue .MaxLength .FixedLength .Precision .Scale .Unicode .Collation .ElementType(元素的类型)
3.3.1.1 CollectionType(集合类型)
3.3.1.2 ReferenceType(引用类型) .Type(引用的实体类型)
3.3.1.3 RowType(行类型)
3.3.1.3.1 Property(属性) .Name .Type .Nullable .DefaultValue .MaxLength .FixedLength .Precision .Scale .Unicode .Collation
3.3.1.4 TypeRef(类型引用).Type(引用的类型) .Nullable .DefaultValue .MaxLength .FixedLength .Precision .Scale .Unicode .Collation
3.3.2 ReferenceType
3.3.3 RowType
4 FunctionImport (导入函数).Name .ReturnType .EntitySet(返回类型是该实体集)
4.1 Parameter
5 ComplexType (复杂类型).Name .BaseType(基类) .Abstract(是否为抽象类型)
5.1 Property .ConcurrencyMode(是否用于开放式并发检查) 其他类似上述Property
6 方面(细则) 适用于Property(属性),TypeRef(类型引用),Parameter(参数) CollectionType(集合类型)
7 基元类型
8 批注元素 (自定义元素)
9 Schema (根) .Namespace(命名空间) .Alias(别名) .xmlns(xml命名空间) .xmlns:cg(xml子空间)
9.1 Using (导入命名空间) .Namespace(导入的命名空间) .Alias(别名)
9.2 EntityContainer (实体容器).Name(名称) .Extends(包含另一实体容器的内容)
9.2.1 EntitySet (实体集).Name(实体集名) .EntityType(实体类型)
9.2.2 AssociationSet
9.2.3 FunctionImport
9.3 EntityType(实体类型) .Name(名称) .BaseType(基类) .Abstract(抽象类) .OpenType(是否为开放实体类型)
9.3.1 Key(键)
9.3.1.1 PropertyRef (属性引用) .Name(所引用的属性名)
9.3.2 Property
9.3.3 NavigationProperty(导航属性).Name(名称) .Relationship(关联) .ToRole (终端) .FromRole(始端)
9.4 Assocaciation
9.5 ComplexType
9.6 Function
二、存储层ssdl
数据定义语言:DDL
连接字符串参数:Provider 提供程序名称;Provider Connection String 连接字符串; Metadata 元数据和映射资源; Name 应用程序配置中的连接名称。
数据提供程序:EntityClient
管理连接:EntityConnection
连接字符串:EntityConnectionStringBuilder
读取命令目标树的结果:EntityDataReader(IExtendedDatarecord)
1.快速参考
1 Schema 框架
1.1 Association 关联
1.1.1 End 端
1.1.1.1 OnDelete 关联删除
1.1.2 ReferentialConstraint 外键约束
1.1.2.1 Pricipal 主体端
1.1.2.1.1 PropertyRef 属性引用
1.1.2.2 Dependent 依赖端
1.1.2.2.1 PropertyRef
1.2 EntityType 实体类
1.2.1 Key 键
1.2.1.1 PropertyRef
1.2.2 Property 属性
1.3 EntityContainer 实体容器
1.3.1 EntitySet 实体集
1.3.1.1 DefiningQuery 定义查询
1.3.2 AssociationSet 关联集
1.3.2.1 End 端
1.4 Function 函数
1.4.1 CommandText 数据库SQL段
1.4.2 Parameter 参数
三、映射层msl
1.快速参考
1 Mapping 映射框架的根 .Space “C-S”
1.1 Alias 别名 .Key 别名 .Value 命名空间
1.2 EntityContainerMapping 概念模型实体容器映射到存储模型实体容器 .CdmEntityContainer 概念模型实体容器 .StorageModelContainer 存储模型实体容器 .GenerateUpdateViews (True|False)
1.2.1 EntitySetMapping 实体集映射 .Name 概念模型实体集 .TypeName 概念模型实体类型 .StoreEntitySet 存储模型实体集 .MakeColummnsDistinct 是否仅返回不同行
1.2.1.1 EntityTypeMapping 实体映射 .TypeName 概念模型实体
1.2.1.1.1 MappingFragment 实体映射到表或视图 .StoreEntitySSet 表或视图 .MakeColumnsDistinct 仅返回不同行
1.2.1.1.1.1 ComplexTypeMapping 复杂类型映射 .TypeName 复杂类型
1.2.1.1.1.1.1 ScalarProperty 属性映射到列表或参数 .Name 概念模型属性 .ColumnName 表列 .ParameterName 参数名 .Version (Current | Original)
1.2.1.1.1.2 ScalarProperty
1.2.1.1.1.3 Condition 条件 .ColumnName 表列 .Name 属性名 .IsNull 是否为null .Value 比较值
1.2.1.1.2 ModificationFunctionMapping 插入、更新和删除函数映射到存储过程
1.2.1.1.2.1 DeleteFunction 删除函数 .FunctionName 存储模型中的函数 .RowsAffectedParameter 受影响函数的输出参数的名称
1.2.1.1.2.1.1 AssociationEnd 关联属性映射 .AssociationSet 关联名 .From 关联的FromRole .To 关联的ToRole
1.2.1.1.2.1.2 ComplexProperty 复杂属性映射 .Name 概念模型实体类型复杂属性的名称 .TypeName属性类型
1.2.1.1.2.1.3 ScarlarProperty
1.2.1.1.2.2 InsertFunction 插入函数
1.2.1.1.2.2.1 AssociationEnd
1.2.1.1.2.2.2 ComplexProperty
1.2.1.1.2.2.3 ResultBinding 返回值映射 .Name 实体属性名 .ColumnName 表列
1.2.1.1.2.2.3 ScarlarProperty
1.2.1.1.2.3 UpdateFunction
1.2.1.1.2.3.1 AssociationEnd
1.2.1.1.2.3.2 ComplexProperty
1.2.1.1.2.3.3 ResultBinding
1.2.1.1.2。3.3 ScarlarProperty
1.2.1.1.3 ScalarProperty
1.2.1.1.4 Condition
1.2.1.2 QueryView 只读结果视图SQL查询 .TypeName 概念模型类型名称
1.2.1.3 MappingFragment
1.2.2 AssociationSetMapping 关联集映射 .Name 关联集名 .TypeName 关联集类型 .StoreEntitySet 表
1.2.2.1 QueryView
1.2.2.2 EndProperty 关联端映射 .Name 端名
1.2.2.2.1 ScalarProperty
1.2.2.3 Condition
1.2.2.4 ModificationFunctionMapping
1.2.2.4.1 InsertFunction 和 DeleteFunction
1.2.2.4.1 EndProperty
1.2.3 FunctionImportMapping 函数导入映射 .FunctionImportName 概念模型中要是映射的函数导入 .FunctionName 存储模型中的函数名
1.2.3.1 ResultMapping 返回类型映射
1.2.3.1.1 EntityTypeMapping
1.2.3.1.2 ComplexTypeMapping
四、LINQ to Entities
1.过程
-
从 ObjectContext 构造 ObjectQuery( T) 实例。
-
通过使用 ObjectQuery( T) 实例在 C# 中编写 LINQ to Entities 查询。
-
将 LINQ 标准查询运算符和表达式将转换为命令目录树。
-
对数据源执行命令目录树表示形式的查询。 执行过程中在数据源上引发的任何异常都将直接向上传递到客户端。
-
将查询结果返回到客户端。
2.不支持的LINQ方法
不支持带int参数的Select, SelectMany, Where;
不支持带IEqualityComparer 参数的GroupJoin,Join
不支持带IEqualityComparer 参数的Contains,Distinct, Except,Intersect,Union
不支持带IComparer参数的OrdeBy,OrderByDescending,ThenBy,ThenByDescending
不支持Reverse
不支持带IEqualityComparer的GroupBy
不支持带筛选器的Aggregate,Average,Count,LongCount,Max,Min,Sum
仅支持映射到概念模型类型(EDM基元类型)的CLR类型;Cast支持EDM基元、OfType支持EntityType
不支持ElementAt、ElementAtOrDefault、Last、LastOrDefault、SkipWhile、TakeWhile
3.LINQ to Entities 和一般LINQ的差异
数据库环境和CLR存在差异,结果取决于数据库是怎么定义数据处理的。一般LINQ是在本地CLR环境下获得支持,但是LINQ to Entities被设计为大部分都依赖异地的数据库环境。
其二,LINQ查询将转变为数据库可以接受的表达式,在异地环境中远程执行,其转换方式必将首先于该环境可以获许的信息限制,那些在CLR中才可能正确执行的操作,绝对不可能在数据库端得到一致的结果。LINQ to Entities不保证和一般LINQ表达式的行为一致。
4.用法简介
投影 from… select | from … from (let)… select
联接 from … join… on… into …| from … join … on …
分组 from … group … by… into
筛选 where | where… (.Contains)
排序 orderby | orderby… descending
聚合 .Average .Count .Max .Min .Sum
分区 .Skip .Take
元素 .First
5.支持的表达式
表达式包含:文本值、方法调用、运算符及其操作数、简单名称(变量名、类型成员名、方法参数名、命名空间名或类型名)。LINQ to Entities 表达式限于 ObjectQuery<T>和基础数据源所支持的运算。
不支持返回常量的函数。
与null比较,结果依赖基础数据源。
支持的函数来源包括: EntityFunctions 规范函数包装类、SqlFunctions基础数据源包装类、存储模型函数、概念模型函数。
聚合规范函数:.Avg(平均值) .BigCount .Count .Max .Min .StDev(标准偏差) .StDevP .Sum .Var(方差) .VarP
数学规范函数:.Abs(绝对值) .Ceiling(向上取整) .Floor(向下取整) .Power(幂) .Round(四舍五入) .Truncate(截取)
字符串规范函数: .Concat(串联) .Contains(是否包含) .EndsWith(是否有指定结尾) .IndexOf(查找位置) .Left(按左截取) .Length(长度) .LTrim(去前导空格) .Replace(替换) .Reverse(反转) .Right(按右截取) .RTrim(去尾随空格) .Substring(取子串) .StartsWith(是否有指定起始) .ToLower(小写) .ToUpper(大写) .Trim(去前导空格和尾随空格)
时间规范函数: .AddNanoseconds(加纳秒) .AddMicroseconds(加微秒) .AddMilliseconds(加毫秒) .AddSeconds(加秒) .AddMinutes(加分钟) .AddHours(加小时) .AddDays(加天数).AddMonths(加月数) .AddYears(加年数).CreateDateTime(新DateTime).CreateDateTimeOffset .CreateTime .CurrentDateTime .CurrentDateTimeOffset .CurrentUtcDateTime .Day .DayOfYear .DiffNanoseconds .DiffMilliseconds .DiffMicroseconds .DiffSeconds .DiffMinutes .DiffHours .DiffDays .DiffMonths .DiffYears .GetTotalOffsetMinutes .Hour .Millisecond .Minute .Month .Second .TruncateTime(截取时间部分) .Year
按位规范函数: .BitWiseAnd(与) .BitWiseNot(反) .BitWiseOr(或).BitWiseXor(异或)
其他规范函数: .NewGuid(新GUID)