zoukankan      html  css  js  c++  java
  • 编程三大核心内容之一:数据处理

    ADO.NET Entity Framework 是对象-关系映射架构,使用CSDL概念架构定义语言和SSDL存储架构定义语言给出数据库和实体类之间的映射信息。这个架构是现阶段最易使用的高层次的数据处理方案。

    image

    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.实体数据模型:

    实体类型、关联类型、属性

    image

    命名空间:<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.同一个关联可以有多个关联集,但关联集不能共享广联集端。

    image

    <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.过程

    1. 从 ObjectContext 构造 ObjectQuery( T) 实例。

    2. 通过使用 ObjectQuery( T) 实例在 C# 中编写 LINQ to Entities 查询。

    3. 将 LINQ 标准查询运算符和表达式将转换为命令目录树。

    4. 对数据源执行命令目录树表示形式的查询。 执行过程中在数据源上引发的任何异常都将直接向上传递到客户端。

    5. 将查询结果返回到客户端。

    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)

  • 相关阅读:
    获取CheckBox的Text值
    动态绑定数据至Html Table
    二次事件并细化功能
    ASP.NET MVC的JavaScriptResult
    Google Earth 8.0
    ASP.NET MVC的ContentResult
    ASP.NET MVC使用input标签上传文件
    处理动态SQL语句的参数
    Infor SyteLine如何快速锁定用户
    执行git push出现"Everything up-to-date"
  • 原文地址:https://www.cnblogs.com/Nobel/p/4141161.html
Copyright © 2011-2022 走看看