当前位置: 首页 > news >正文

遵义公司做网站找哪个公司好营销型网站有哪些功能

遵义公司做网站找哪个公司好,营销型网站有哪些功能,网站开发的软件环境有哪些,asp.net开发微网站开发预备知识 2 LINQ技术 2 LINQ技术的基础 - C#3.0 2 自动属性 2 隐式类型 2 对象初始化器与集合初始化器 3 匿名类 3 扩展方法 4 Lambda表达式 4 .NET中的数据访问 4 DataSet方案 5 改进的的DataSet方案 5 手写代码通过ADO.NET2…预备知识    2 LINQ技术    2 LINQ技术的基础 - C#3.0    2 自动属性    2 隐式类型    2 对象初始化器与集合初始化器    3 匿名类    3 扩展方法    4 Lambda表达式    4 .NET中的数据访问    4 DataSet方案    5 改进的的DataSet方案    5 手写代码通过ADO.NET2.0连接类与数据库交互    5 ORM – LINQ to SQL    6 深入了解Entity Framework    7 Entity Framework的核心 – EDM(Entity Data Model)    7 EDM概述    7 EDM之CSDL    7 EDM之SSDL    11 EDM之MSL    12 EDM中存储过程的设计    15 EDM中ComplexType的设计    16 实体数据模型映射方案    17 Entity Framework的原理及使用方式    18 各种使用方式总结    18 使用技巧及需要注意的问题    21 几种方法的性能分析及使用选择    21 其它操作EDM的方式    22 为什么要使用Entity Framework限制条件及当前版本框架的问题    23 EDM中的DML    23 含有Association的EDM的使用    23     本文档主要介绍.NET开发中两项新技术.NET平台语言中的语言集成查询技术 - LINQ与ADO.NET中新增的数据访问层设计技术ADO.NET Entity Framework。ADO.NET的LINQ to Entity部分以LINQ为基础为了完整性本文档首先介绍LINQ技术。 预备知识 LINQ技术 LINQ是.NET 3.5中新增的一种技术这个技术扩展了.NET平台上的编程语言使其可以更加方便的进行数据查询单纯的LINQ技术主要完成对集合对象如System.Collection下或System.Collection.Generic命名空间下的对象的查询。结合LINQ Provider可以实现对XML文件使用LINQ to XML – 位于System.Xml.Linq命名空间下的类数据库可以使用LINQ to SQL或下文要详细介绍的LINQ to Entity等对象的操作。   LINQ是一种运行时无关的技术其运行于CLR2.0之上微软对C#3.0与VB9.0的编译器进性扩展从而使其可以将LINQ编写的程序编译为可以被CLR2.0的JIT所理解的MSIL。   LINQ技术的基础 - C#3.0 自动属性 隐式类型 对象集合初始化器 匿名类 扩展方法 Lambda表达式 自动属性 这个概念很简单其简化了我们在.NET的时候手写一堆私有成员属性的编程方式我们只需要使用如下方式声明一个属性编译器会自动生成所需的成员变量。 public class Customer { public int Id { get; set; } public string Name { get; set; } }     在我使用LINQ完成的项目中使我了解到自动属性方便的一个用途如下     在使用LINQ获取数据的过程中我们常常需要使用select new语句查询出一个对象往往是IEnumerable类型的用于数据绑定。在一般情况下如果是直接绑定如直接将查询结果赋给一个Gridview控件的DataSource属性我们可以直接select new来返回一个匿名类的对象。如果我们还需要对这个集合对象进行进一步操作我们将必须使用select new class-name这样的语言返回一个类的对象大部分情况下这个类只作为实体的一个结构而不需要完成一些操作操作这时候使用自动属性来完成这个类将是非常简洁高效的。 隐式类型 这个名称可能对你很陌生但是var这个关键字应该都用过在C#中使用var声明一个对象时编译器会自动根据其赋值语句推断这个局部变量的类型。赋值以后这个变量的类型也就确定而不可以再进行更改。另外var关键字也用于匿名类的声明。     应用场合var主要用途是表示一个LINQ查询的结果。这个结果可能是ObjectQuery或IQueryable类型的对象也可能是一个简单的实体类型的对象。这时使用var声明这个对象可以节省很多代码书写上的时间。 对象初始化器与集合初始化器     在.NET2.0中构造一个对象的方法一是提供一个重载的构造函数二是用默认的构造函数生成一个对象然后对其属性进行赋值。在.NET3.5/C#3.0中我们有一种更好的方式来进行对象的初始化。那就是使用对象初始化器。这个特性也是匿名类的一个基础所以放在匿名类之前介绍。     还是那就话好的代码强于注释下面用几个代码段说明初始化器 代码出自李永京的博客 http://lyj.cnblogs.com/ 基本用法 User user new User { Id 1, Name YJingLee, Age 22 };   嵌套使用 User user new User {      Id 1,      Name YJingLee,      Age 22,      Address new Address      {           City NanJing,           Zip 21000      } };     类似于对象初始化器初始化一个对象集合初始化器初始化一个集合一句话有了它你就不用在将元素通过Add逐个添加了。仍然给出代码示例 基本使用 Listint num new Listint { 0, 1, 2, 6, 7, 8, 9 };   结合对象初始化器我们可以写出如下简洁的代码 ListUser user new ListUser{ new User{Id1,NameYJingLee,Age22}, new User{Id2,NameXieQing,Age25}, }; 应用场合     还是前文提到的select new class-name语法后面可以直接接一个初始化器来将查询结果返回到这个对象。 匿名类 有了前文初始化器的介绍匿名类就很简单了。我们可以使用new { object initializer }或new[]{ object, …}来初始化一个匿名类或不确定类型的数组。匿名类的对象需要使用var关键字声明。示例代码 var p1 new { Id 1, Name YJingLee, Age 22 }; 应用场合 还是同上面的例子提到的当直接使用select new { object initializer }这样的语法就是将一个LINQ查询的结果返回到一个匿名类中。 扩展方法     扩展方法是C#中新增的很重要的特性之一。其对于LINQ的实现起着关键的作用。在.NET2.0时代是没有LINQ的所以.NET2.0以及之前版本中的集合类在设计的时候没有预留用于LINQ的方法。为了在不破坏这个类现有封装的前提下又可以为其添加LINQ的支持就需要用到扩展方法。     扩展方法使用上类似于静态方法但在本质上其是实例方法。这是由于.NET3.5的运行环境仍然为CLR2.0所以语言不可能做很大的变革这一切都是语法糖。 下面仍然通过一段代码来说明扩展方法的实现 代码出自李永京 http://lyj.cnblogs.com/ public static class Extensions { public static bool IsValidEmailAddress(this string s)     { Regex regex new Regex(^[\w-\.]([\w-]\.)[\w-]{2,4}$); return regex.IsMatch(s);     } } 如上代码所示扩展方法为一静态方法声明于一个静态类其参数前加上一个this关键字参数的类型表示这个扩展方法要对这个类型进行扩展。如上述代码表示其要对字符串类型进行扩展。 在应用上扩展方法被作为其扩展的类型的静态方法来调用。如下 if (email.IsValidEmailAddress()) {     Response.Write(YJingLee提示:这是一个正确的邮件地址); } Lambda表达式 Lambda表达式是对.NET2.0中匿名方法在语法形式上的进一步改进仍然以代码说明 var inString list.FindAll(delegate(string s) { return s.Indexof(YJingLee) 0; });   使用Lambda表达式代码将更自然易懂。 var inString list.FindAll(s s.Indexof(YJingLee) 0);   可以看出Lambda表达式格式为(参数列表)表达式或语句块 另外我对于Lambda表达式树的概念还不是很明白有明白的指点一下。   .NET中的数据访问 这一部分介绍.NET中不同的数据访问层的使用方式由此得出Entity Framework在一个.NET系统中的应用及其在原有设计基础上的改变。从大的方面来看数据访问的设计方案基本有如下几类 DataSet 手写代码通过ADO.NET2.0连接类与数据库交互 ORM组件 DataSet方案 最基本的Dataset数据访问的实现使用下图表示 图1 如图所示DataSet与数据源之间通过DataAdapter连接逻辑中直接访问DataSet获取数据或是通过ADO.NET2.0的非连接类或者通过强类型DataSet以一种类型安全的方式访问数据。     缺点逻辑代码与数据访问代码耦合高。 改进的的DataSet方案 图2 这种设计方式将业务所需的实体抽象出来并把对DataSet的操作封装在其中这样一定程序上解除业务逻辑与数据访问间的耦合。 手写代码通过ADO.NET2.0连接类与数据库交互 这种方式是我使用的最多的一种方式其可以提供最大的控制能力且效率最高唯一的不足是当业务变化时修改数据访问代码的工作量比较大通过代码生成器也能一定程度上解决这个问题   ORM – LINQ to SQL 在.NET平台下ORM的解决方案有不少本文只讨论两个微软官方的解决方案。先是LINQ to SQL技术。LINQ to SQL是一个将不再更新的技术。其有很多不足之处如不能灵活的定义对象模型与数据表之间的映射、无法扩展提供程序只能支持SQL Server等。 这样数据访问层的设计如下所示 图3   ORM – ADO.NET Entity Framework 作为下一代数据访问的技术领导者。Entity Framework的设计很多地方都保留了高扩展性。其最重要的一个改进在于其映射定义的灵活性。先来看下图 图4 由图可以看出使用Entity Framework可以充分的定义与数据库表映射的实体并将这个实体直接用于业务逻辑层或作为服务的数据契约。实体设计较其他技术的优势体现在以下几方面 创建ComplexTypeCSDL部分有讨论 EntitySet的继承 使用Entity Framework后可以将实体类的设计工作完全放在EDM的设计过程中而不再需要手工写一些大同小异的代码并且对这个实体模型包含于EDM中可以在运行时修改并生效。另外开发人员与数据库直接打交道的次数将大大减少大部分时间开发人员只需操作实体模型框架会自动完成对数据库的操作。下文将详细讨论上图所示的EDM。 深入了解Entity Framework Entity Framework的核心 – EDM(Entity Data Model) EDM概述 实体数据模型简称EDM由三个概念组成。概念模型由概念架构定义语言文件 (.csdl)来定义映射由映射规范语言文件 (.msl)存储模型又称逻辑模型由存储架构定义语言文件 (.ssdl)来定义。这三者合在一起就是EDM模式。EDM模式在项目中的表现形式就是扩展名为.edmx的文件。这个包含EDM的文件可以使用Visual Studio中的EDM设计器来设计。由于这个文件本质是一个xml文件可以手工编辑此文件来自定义CSDL、MSL与SSDL这三部分。下面详细分析一下这个xml文件及三个其重要组成部分 这个文件展示了示例项目完整的EDM文件的XML形式 文件 这个设计器生成的文件的注释可以使你很清楚的明白这个EDM文件的组成。一点点分析一下第一行表明这是一个xml文件。 ?xml version1.0 encodingutf-8? 以下这一行是EDM的根节点定义了一个表明版本的属性及这个EDM使用的命名空间 edmx:Edmx Version1.0 xmlns:edmxhttp://schemas.microsoft.com/ado/2007/06/edmx 接下来由注释可以看到EDM被分为两部分第一部分是EDM的核心第二部分用于实体设计器这一部分不用研究。 第一部分中节点edmx:Runtime下定义了以下三部分 EDM之CSDL     CSDL定义了EDM或者说是整个程序的灵魂部分 – 概念模型。当前流行的软件设计方法通常都是由设计其概念模型起步。说概念模型可能比较抽象一个更容易接受的名字就是实体类。实体类是面向对象设计中一个最根本的组成部分其体现了现实世界中对象作为一种计算中可以表示的对象设计方法。而EDM的CSDL就是要达到这样一个目的。这个在下文介绍Entity Framework优点时另有说明。     这个文件完全以程序语言的角度来定义模型的概念。即其中定义的实体、主键、属性、关联等都是对应于.NET Framework中的类型。下面xml element来自作业提交系统有删节 !-- CSDL content -- edmx:ConceptualModels Schema NamespaceASSModel AliasSelf xmlnshttp://schemas.microsoft.com/ado/2006/04/edm EntityContainer NameASSEntities FunctionImport NameGETHOUSEWORKDONE EntitySetUpAssignments ReturnTypeCollection(Self.UpAssignments) Parameter NameStuID TypeInt32 ModeIn / Parameter NameClassID TypeInt32 ModeIn / Parameter NameSemester TypeString ModeIn / /FunctionImport !-- 以上删节 – 5个存储过程 --   EntitySet NameAssignments EntityTypeASSModel.Assignments / EntitySet NameClasses EntityTypeASSModel.Classes / EntitySet NameCourses EntityTypeASSModel.Courses / EntitySet NameSetCourses EntityTypeASSModel.SetCourses / EntitySet NameStudents EntityTypeASSModel.Students / EntitySet NameTeachers EntityTypeASSModel.Teachers / EntitySet NameUpAssignments EntityTypeASSModel.UpAssignments /   AssociationSet NameFK_SetCourses_Classes AssociationASSModel.FK_SetCourses_Classes End RoleClasses EntitySetClasses / End RoleSetCourses EntitySetSetCourses / /AssociationSet !-- 以上删节 – 6个关系集 --   /EntityContainer   !-- 以下保留一个EntityType作为示例 -- EntityType NameStudents Key PropertyRef NameStuID / /Key Property NameStuID TypeInt32 Nullablefalse / Property NameStuName TypeString Nullablefalse MaxLength10 Unicodetrue FixedLengthtrue / Property NamePswd TypeString Nullablefalse MaxLength50 Unicodefalse FixedLengthtrue / NavigationProperty NameClasses RelationshipASSModel.FK_Students_Classes FromRoleStudents ToRoleClasses / NavigationProperty NameUpAssignments RelationshipASSModel.FK_UpAssignments_Students FromRoleStudents ToRoleUpAssignments / /EntityType   !-- 仅保留与上文AssociationSet对应的Association -- Association NameFK_SetCourses_Classes End RoleClasses TypeASSModel.Classes Multiplicity1 / End RoleSetCourses TypeASSModel.SetCourses Multiplicity* / /Association /Schema /edmx:ConceptualModels 这部分XML文档Schema是CSDL的根元素其中定义的Namespace是用于ObjectContext与EntityClass的命名空间Alias-别名为此命名空间Namespace指定一个易记的名称在定义Alias之后在此Schema内的Element均可以该Alias作为Namespace的别名。Alias的使用可以参考如下xml element: FunctionImport NameGETHOUSEWORKDONE EntitySetUpAssignments ReturnTypeCollection(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 NameStudents Key PropertyRef NameStuID / /Key Property NameStuID TypeInt32 Nullablefalse / Property NameStuName TypeString Nullablefalse MaxLength10 Unicodetrue FixedLengthtrue / Property NamePswd TypeString Nullablefalse MaxLength50 Unicodefalse FixedLengthtrue / NavigationProperty NameClasses RelationshipASSModel.FK_Students_Classes FromRoleStudents ToRoleClasses / NavigationProperty NameUpAssignments RelationshipASSModel.FK_UpAssignments_Students FromRoleStudents ToRoleUpAssignments / /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 NameFK_SetCourses_Classes End RoleClasses TypeASSModel.Classes Multiplicity1 / End RoleSetCourses TypeASSModel.SetCourses Multiplicity* / /Association 这一节符合以下结构 Association End / ReferentialConstraint Principal PropertyRef / /Principal Dependent PropertyRef / /Dependent /ReferentialConstraint /Association 属性及其子元素属性的说明     Association  Name Association的名称  End 类似于AssociationSetAssociation也有两个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 NamespaceASSModel.Store AliasSelf ProviderSystem.Data.SqlClient ProviderManifestToken2008 xmlns:storehttp://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator xmlnshttp://schemas.microsoft.com/ado/2006/04/edm/ssdl EntityContainer NameASSModelStoreContainer EntitySet NameAssignments EntityTypeASSModel.Store.Assignments store:TypeTables Schemadbo / !-- 省略7个EntitySet的定义 -- /EntityContainer   !-- 以下省略7个EntityType的定义 -- EntityType NameAssignments Key PropertyRef NameAssID / /Key Property NameAssID Typeint Nullablefalse StoreGeneratedPatternIdentity / Property NameAssName Typenchar Nullablefalse MaxLength20 / Property NameAssDes Typenvarchar MaxLength500 / Property NameSCID Typeint Nullablefalse / Property NameDeadline Typedatetime Nullablefalse / Property NameQuesFileName Typenvarchar MaxLength500 / Property NameQuesFileUrl Typenvarchar Nullablefalse MaxLength500 / /EntityType   !-- 保留与CSDL中对应的Function -- Function NameGETHOUSEWORKDONE Aggregatefalse BuiltInfalse NiladicFunctionfalse IsComposablefalse ParameterTypeSemanticsAllowImplicitConversion Schemadbo Parameter NameStuID Typeint ModeIn / Parameter NameClassID Typeint ModeIn / Parameter NameSemester Typevarchar ModeIn / /Function   /Schema /edmx:StorageModels 看文档的结构SSDL与CSDL很详细只是其中EntityType等使用数据库的概念的描述。 这其中有一个需要稍微介绍节点DefiningQuery首先看一下其出现的位置 EntityContainer   EntitySet   DefiningQuery 通过查询定义一个SSDL的EntitySet  特定于存储的查询语句 DefiningQuery定义通过实体数据模型 (EDM) 内的客户端投影映射到数据存储视图的查询。此类映射是只读的。也就是说如果想要更新此类EntitySet需要使用下文介绍存储过程时提到的定义更新实体的存储过程的方法使用定义的存储过程来更新这样的EntitySet。当在实体类设计器中导入无主键的表时会自动生成此类使用DefiningQuery定义的EntitySet要式样Entity Framework提供的自动更新服务而不定义存储过程需要给数据表添加一个适当的主键删除DefiningQuery节点并更新数据模型。 EDM之MSL 这个文件即上面所述的CSDL与SSDL的对应主要包括CSDL中属性与SSDL中列的对应。 !-- C-S mapping content -- edmx:Mappings Mapping SpaceC-S xmlnsurn:schemas-microsoft-com:windows:storage:mapping:CS EntityContainerMapping StorageEntityContainerASSModelStoreContainer CdmEntityContainerASSEntities EntitySetMapping NameAssignments EntityTypeMapping TypeNameIsTypeOf(ASSModel.Assignments) MappingFragment StoreEntitySetAssignments ScalarProperty NameQuesFileName ColumnNameQuesFileName / ScalarProperty NameAssDes ColumnNameAssDes / ScalarProperty NameAssID ColumnNameAssID / ScalarProperty NameAssName ColumnNameAssName / ScalarProperty NameDeadline ColumnNameDeadline / ScalarProperty NameQuesFileUrl ColumnNameQuesFileUrl / /MappingFragment /EntityTypeMapping /EntitySetMapping !-- 省略EntitySetMapping若干 --   !-- 保留对应于CSDL与SSDL的FunctionImportMapping -- FunctionImportMapping FunctionImportNameGETHOUSEWORKDONE FunctionNameASSModel.Store.GETHOUSEWORKDONE /   AssociationSetMapping NameFK_UpAssignments_Assignments TypeNameASSModel.FK_UpAssignments_Assignments StoreEntitySetUpAssignments EndProperty NameAssignments ScalarProperty NameAssID ColumnNameAssID / /EndProperty EndProperty NameUpAssignments ScalarProperty NameUpAssID ColumnNameUpAssID / /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映射方案中第二条将一个概念模型的实体映射到多个存储模型的实体的关键设置。 说明2Contain这个元素及其属性的作用是当多个概念模型实体映射到一个存储模型实体时该元素的属性决定了在什么情况下一个概念模型实体映射到指定的存储模型实体。 说明3QueryView 元素定义概念模型中的实体与存储模型中的实体之间的只读映射。使用根据存储模型计算的 Entity SQL 查询定义此查询视图映射并以概念模型中的实体表达结果集。同DefiningQuery定义的查询。此映射也是只读的。就是说如果想要更新此类EntitySet也需要使用下文介绍存储过程时提到的定义更新实体的存储过程的方法使用定义的存储过程来更新这样的EntitySet。当多对多关联在存储模型中所映射到的实体表示关系架构中的链接表时必须为此链接表在AssociationSetMapping 元素中定义一个QueryView元素。定义查询视图时不能在 AssociactionSetMapping 元素上指定 StorageSetName 属性。定义查询视图时AssociationSetMapping 元素不能同时包含 EndProperty 映射。 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需要对一下节点进行定义 EntityContainerMapping   EntitySetMapping EntityContainer中每个EntitySet的对应  EntityTypeMapping 描述CSDL中EntityType与SSDL中EntityType的对应  ModificationFunctionMapping CUD对应的存储过程  InsertFunction/ UpdateFunction / DeleteFunction FunctionName    使用创建或删除在数据源中使用链接表实现的实体类型之间的多对多关系的存储过程需要修改如下两个文件SSDL对其的修改要求与上文表中列出的一致 MSL需要对一下节点进行定义 EntityContainerMapping   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 之间的关联。 派生类型之间的关联。此映射支持一个层次结构中的派生类型与另一个层次结构中的派生类型之间的关联。   Entity Framework的原理及使用方式 ADO.NET Entity Framework操作数据库的过程对用户是透明的当然我们可以通过一些工具或方法了解发送到数据库的SQL语句等。我们唯一能做的是操作EDMEDM会将这个操作请求发往数据库。     Entity Framework实现了一套类似于ADO.NET2.0中连接类它们使用方式相同均基于Provider模式的被称作EntityClient的类用来操作EDM。ADO.NET2.0的连接类是向数据库发送SQL命令操作表或视图而EntityClient是向EDM发送EntitySQL操作Entity。EntityClient在EntityFramework中的作用是相当重要的所有发往EDM的操作都是经过EntityClient包括使用LINQ to Entity进行的操作。 各种使用方式总结     上文提到对EDM的操作首先通过一个图来展现一下目前我们可用的操作的EDM的方式   这几种访问方式使用介绍如下部分示例代码来源MSDN Magzine EntityClientEntitySQL 示例代码 string city London; using (EntityConnection cn new EntityConnection(NameEntities)) { cn.Open(); EntityCommand cmd cn.CreateCommand(); cmd.CommandText SELECT VALUE c FROM Entities.Customers AS c WHERE c.Address.City city; cmd.Parameters.AddWithValue(city, city); DbDataReader rdr cmd.ExecuteReader(CommandBehavior.SequentialAccess); while (rdr.Read()) Console.WriteLine(rdr[CompanyName].ToString()); rdr.Close(); }   ObjectServiceEntitySQL 在有EntityClientEntitySQL这种使用方式下使用ObjectServiceEntitySQL的方式是多此一举不会得到任何编辑时或运行时的好处。在ObjectContext下使用EntitySQL的真正作用是将其与LINQ to Entity结合使用。具体可见下文所示。 示例代码 string city London; using (Entities entities new Entities()) { ObjectQueryCustomers query entities.CreateQueryCustomers( SELECT VALUE c FROM Customers AS c WHERE c.Address.City city, new ObjectParameter(city, city) );   foreach (Customers c in query) Console.WriteLine(c.CompanyName); }   ObjectContextLINQ( to Entity) 方式一 string city London; using (Entities entities new Entities()) { var query from c in entities.Customers where c.Address.City city select c;   foreach (Customers c in query) Console.WriteLine(c.CompanyName); }     方式二 string city London; using (Entities entities new Entities()) { var query entities.Customers.Where(r r.Address.City city);   foreach (Customers c in query) Console.WriteLine(c.CompanyName); } 这两段示例代码中的entities.Customer的写法隐式调用了2中示例的ObjectQueryCustomers来进行查询关于此可以参见EDM的设计器文件-xxx.designer.cs。在方式二中的Where方法传入的是一个Lambda表达式你也可以传入一条EntitySQL语句做参数来将LINQ与EntitySQL结合使用。如下代码演示其使用 string city London; using (Entities entities new Entities()) { var query entities.Customers.Where(r.Address.City city);   foreach (Customers c in query) Console.WriteLine(c.CompanyName); } 使用技巧及需要注意的问题 这也是上文提到的在ObjectContext下使用EntitySQL的一个主要作用上面的例子比较简单可能看不到这样使用的优势但是如下两种情况下使用EntitySQL可能是最好的选择。 动态构建查询条件当查询条件的个数固定时我们也可以采用罗列多个Where扩展方法的形式如下 ObjectQuery.Where(LambdaExpression1) .Where(LambdaExpression2)… 但是当这个条件的存在与否需要在运行时判断时我们只能通过组合字符串来得到这个条件我们可以将条件组合为EntitySQL并传递给Where()方法。 数据库模糊查询 下面代码演示使用EntitySQL的like完成模糊查询 context.Customer.Where(it.CustomerID LIKE CustomerID, new System.Data.Objects.ObjectParameter(CustomerID,%V%)); 这个并不是只能使用EntitySQL来实现LINQ to Entity也可以很容易完成。如下代码 context.Customer.Where(r r.CustomerID.Contains(V)); 同理V%、%V可以分别使用StartsWith()与EndsWith()函数实现。       使用LINQ to Entity需要注意的一个方面是在完成查询得到需要的结果后使用ToList或ToArray方法将结果转变为内存中的对象然后使用LINQ to Objects来处理否则处在Entity Framework的联机模式下对性能有很大的影响。   几种方法的性能分析及使用选择 首先用下图来说明一个执行过程。     图中所示表达的意思已经非常清楚稍加解释的是无论是通过EntityClient直接提供给Entity Client Data Provider的Entity SQL还是通过ObjectService传递的Entity SQL或是LINQ to Entity都在Entity Client Data Provider中被解释为相应的Command Tree并进一步解释为对应数据库的SQL。这样来看使用LINQ to Entity与Entity SQL的效率应该差不多但是还有一个问题那就是EntitySQL所转换的最终SQL可能要比LINQ to Entity生成的SQL效率高这在一定程度上使两者效率差增大但是LINQ to Entity有其它技术无法比拟的好处那就是它的强类型特性编辑时智能感知提醒编译时发现错误这都是在一个大型项目中所需要的。虽然现在也有了调试EntitySQL的工具但其与强类型的LINQ to Entity还是有很大差距。     另外在ObjectService与直接使用EntityClient问题的选择上。如果你想更灵活的控制查询过程或者进行临时查询建议选择EntityCLient如果是操作数据那只能采用ObjectService。   上文总结了各种操作EDM的方式下面引用MSDN的一个对这几种技术进行比较的表格    EntityClient 和实体 SQL 对象服务和实体 SQL 对象服务和 LINQ 定向到 EntityClient 提供程序 是 否 否 适合临时查询 是 是 否 可直接发出 DML 否 否 否 强类型化 否 否 是 可将实体作为结果返回 否 是 是 通过这个表可以很好对某一场合下应该选择的技术进行判断。EntityClient 和实体 SQL可以进行最大的控制而使用LINQ to Entity可以获得最佳的编辑时支持。   其它操作EDM的方式 通过EdmGen更灵活的控制EDM 在.NET Framework 3.5的文件夹下有一个名为EdmGen的工具Visual Studio的实体设计器就是调用这个工具来完成EDM的生成等操作。通过直接使用这个工具的命令行选项我们可以进行更多的控制。 这个命令的参数及作用如下 EdmGen 选项 /mode:EntityClassGeneration 从 csdl 文件生成对象 /mode:FromSsdlGeneration 从 ssdl 文件生成 msl、csdl 和对象 /mode:ValidateArtifacts 验证 ssdl、msl 和 csdl 文件 /mode:ViewGeneration 从 ssdl、msl 和 csdl 文件生成映射视图 /mode:FullGeneration 从数据库生成 ssdl、msl、csdl 和对象 /project:字符串 用于所有项目文件的基名称 (短格式: /p) /provider:字符串 用于 ssdl 生成的 Ado.Net 数据提供程序的名称。(短格式: /prov) /connectionstring:连接字符串 您要连接到的数据库的连接字符串 (短格式: /c) /incsdl:文件 从中读取概念模型的文件 /refcsdl:文件 包含 /incsdl 文件所依赖的类型的 csdl 文件 /inmsl:文件 从中读取映射的文件 /inssdl:文件 从中读取存储模型的文件 /outcsdl:文件 将生成的概念模型写入到其中的文件 /outmsl:文件 将生成的映射写入到其中的文件 /outssdl:文件 将生成的存储模型写入到其中的文件 /outobjectlayer:文件 将生成的对象层写入到其中的文件 /outviews:文件 将预生成的视图对象写入到其中的文件 /language:CSharp 使用 C# 语言生成代码 /language:VB 使用 VB 语言生成代码 /namespace:字符串 用于概念模型类型的命名空间名称 /entitycontainer:字符串 用于概念模型中的 EntityContainer 的名称 /help 显示用法信息 (短格式: /?) /nologo 取消显示版权消息   使用示例 从 Northwind 示例数据库生成完整 Entity Model。 EdmGen /mode:FullGeneration /project:Northwind /provider:System.Data.SqlClient /connectionstring:server.\sqlexpress;integrated securitytrue; databasenorthwind 从 ssdl 文件开始生成 Entity Model。 EdmGen /mode:FromSSDLGeneration /inssdl:Northwind.ssdl /project:Northwind 验证 Entity Model。 EdmGen /mode:ValidateArtifacts /inssdl:Northwind.ssdl /inmsl:Northwind.msl /incsdl:Northwind.csdl   为什么要使用Entity Framework限制条件及当前版本框架的问题 优势 通过对比上面图4与图2、图3我们可以很清楚的看到使用Entity Framework一个很大的好处我们可以把实体类的定义由一个单独的项目使用C# class完成这样一种设计方式转变为使用xml文件定义并集成到数据访问层。     在以往要在一个项目中动态创建实体我所知的方法是把要添加的实体放入一个程序集然后通过反射加载程序集。现在可以通过动态更改EDM的方法来增加实体并将其映射到数据库后者是以前无法实现的。     便于更改数据库当更换数据库后只需修改SSDL的定义如果数据库的表明有变动也只需多修改MSL对CSDL没有任何影响从而也不需要对程序的BLL等上层部分做任何改动。 条件 要想让一个数据库支持Entity Framework一个必要条件就是该数据库需提供相应的Entity Client Data Provider这样才能将Entity SQL转换为针对此数据此数据库的SQL并交由ADO.NET来执行。当然该数据库还需要提供ADO.NET Data Provider。 缺陷 Entity Framework技术的效率问题是其几乎唯一一个稍有不足之处。首先其将EntitySQL转换为SQL的方式属于解释性转换性能较差。另外Entity Framework在每次应用启动时需要读取EDM这个过程较慢但在后续操作时就不再存在这个问题。   EDM中的DML 由于当前的EntitySQL不支持DML操作所以当前版本的Entity Framework的插入、更新及删除操作需要通过Object Service来完成。在EDM的设计器文件xxx.designer.cs中自动生成了一些签名为 void AddToEntity(EntityType entity) 的方法。我们只需要新建一个实体对象并调用这个方法添加实体即可。注意这个函数内部调用     entities.AddObject(EntitySetName, entity); 最后调用entities.SaveChanges()方法将修改保存回数据库这是所有三种更新操作所需的。更新与删除操作都需要先使用ObjectService定位操作的实体对象更新操作直接使用赋值运算符删除操作则调用     entites.DeleteObject(object o); 方法。之后调用entities.SaveChanges()方法保存这个过程简单不再赘述。   含有Association的EDM的使用     当前版本的Entity Framework不支持自动延迟加载所有当前未使用的关系中的相关实体默认按不加载处理当我们需要通过关系获取一个实体对象时我们可以采用两种方法 显示加载实体框架针对 EntityReference 类的每个实例提供一个 Load 方法。此方法可用于显式加载与另一实体相关的一个集合。我们只需在访问关系中实体之前调用其Load即可当然提前判断该实体是否已经加载是一种比较好的实践。如下代码所示 using (Entities entities new Entities()) { var query (from o in entities.Orders where o.Customers.CustomerID ALFKI select o); foreach (Orders order in query) { if (!order.CustomersReference.IsLoaded) order.CustomersReference.Load(); Console.WriteLine(order.OrderID --- order.Customers.CompanyName); } } 预先加载 先看代码示例 using (Entities entities new Entities()) { var query (from o in entities.Orders.Include(Customers) where o.ShipCountry USA select o);   foreach (Orders order in query) Console.WriteLine(order.OrderID --- order.Customers.CompanyName); } 查询中针对 Orders 实体调用的 Include 方法接受了一个参数该参数在本示例中将要求查询不仅要检索 Orders而且还要检索相关的 Customers。这将生成单个 SQL 语句它会加载满足 LINQ 查询条件的所有 Order 和 Customer。 两种加载关系实体的方式的选择根据如果针对关系数据你只需做一到两次查询则使用显示加载更高效如果要持续访问关系实体中数据则使用预先加载。   关系下的添加更新与删除与上述操作基本相同唯一需要注意的是删除操作不支持级联删除需要手工遍历所有的相关项并将其一一删除。注意这里删除操作不能使用foreach来遍历需要删除的关系实体。取而代之的有两种方法 while法 while (result.Order_Details.Count 0) { // 删除操作… } ToList法以非联机方式操作 var items result.Order_Details.ToList(); foreach (var item in items) { // 删除操作… } 最新补充 Entity Framework在开发中的应用 – Entity Framework与控件 .NET Framework提供了许多xxxDataSource控件如SqlDataSourceObjectDataSource等这些数据源控件大大方便了我们的数据绑定操作。不幸的是目前还没有针对Entity Framework的数据源控件发布但是将数据绑定到诸如ListBoxGrrdview或DetailsView控件也是很简单的。这源于使用ObjectContext操作返回的IQueryableT对象或是使用EntityClient查询返回的ObjectQuery对象都实现了IEnumerable接口。这样很容易将这些数据绑定到数据显示控件。更新操作可以按上文所述在相应的时间处理函数中写更新EDM的程序即可。 Entity Framework的链接字符串     默认情况下(Visual Studio对Entity Framework数据项目的默认设置)EDM这个XML文件被作为资源在编译时嵌入到程序集中。这种情况下当更改EDM后需要重新编译这个程序集才能使更改生效。通过更改项目属性也可以让EDM作为三个独立的XML文件存在于项目中。为了让应用程序可以找到EDM无论其以什么方式存储需要一个链接字符串来指示EDM所在的位置。实体模型设计器生成的链接字符串如下所示 add nameASSEntities connectionString metadatares://*/ass.csdl| res://*/ass.ssdl| res://*/ass.msl; providerSystem.Data.SqlClient; provider connection stringquot;Data Source(local);Initial CatalogASS;Integrated SecurityTrue;MultipleActiveResultSetsTruequot; providerNameSystem.Data.EntityClient / http://msdn.microsoft.com/zh-cn/library/cc716756.aspx 关键的一点应用程序是怎样找到这个字符串的对于使用EntityClient的情况可以直接将连接字符串赋给EntityConnection的ConnectionString属性另外对于使用ObjectContext其可以自动由配置文件检索这个连接字符串。转载于:https://www.cnblogs.com/vebest/archive/2010/06/03/1750685.html
http://www.zqtcl.cn/news/309044/

相关文章:

  • 自己的网站wordpress自动变化文字
  • 北京制作网站公司哪家好wordpress小工具不显示不出来
  • 如何建设一个新的网站h5网站建设价格
  • 无锡专业做网站的怎么攻击php做的网站
  • 盐城网站建设代理商wordpress定义字体颜色
  • 成都旅游网站建设地址自己做的网站怎么被搜索出来
  • 网站建设免费免代码商城微网站如何做
  • 网站建设域名是什么东莞网络科技营销
  • 法语网站建设高端网站建设 骆
  • vue网站开发注意事项做设计想接外单去哪个网站好
  • 免费模板下载网站推荐苏州seo
  • 徐州市水利工程建设有限公司网站网站建设技术团队有多重要性
  • 合肥佰瑞网站搜索引擎优化步骤
  • 营销型网站建设亏1广西桂林天气预报15天
  • 想做一个网站平台怎么做公司网站建设费用估计
  • 电商网站开发平台pi netwo网页设计文件下载
  • 南平网站设计笔记本怎么建设网站
  • 舆情分析网站免费人工智能培训班收费标准
  • 青岛网站建设 大公司制作相册视频
  • 什么是网站的域名jquery素材网站
  • 课程网站建设ppt模板百度seo推广
  • 网站建设需要用到什么怎么在电脑上用手机app软件
  • 公司做网站有意义么网站认证必须做么
  • 网站虚拟空间更新缓存php外贸网站建设
  • 河南省建设执业资格注册中心网站门户定制网站建设公司
  • 网站开发比较厉害wordpress中文 插件
  • 文化投资的微网站怎么做个人微信公众号如何推广
  • 单位的网站怎样设计才美观网页设计图片的代码
  • 长沙专业做网站排名济南手机网站定制费用
  • 西安专题门户响应式网站建设系统网站有哪些