课程代码课件-orm ef框架进阶专题_第1页
课程代码课件-orm ef框架进阶专题_第2页
课程代码课件-orm ef框架进阶专题_第3页
课程代码课件-orm ef框架进阶专题_第4页
课程代码课件-orm ef框架进阶专题_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本文档主要介绍.NET开发中两项新技术,.NET平台语言中的语言集成查询技术-LINQ,与ADO.NET中新增的数据 层设计技术ADO.NETEntityFramework。ADO.NET的LINQtoEntity部分以LINQ为基础,为了完整性首先介绍LINQ技术。预备预备知LINQ技LINQ是.NET3.5中新增的一种技术,这个技术扩展了.NET平台上的编程语言,使其可以更加方便的进行LINQ(如System.Collection下或System.Collection.Generic命名空间下的对象)的查询。结合LINQProvider可以实现对XML文件(使用LINQtoXML–位于System.Xml.Linq(LINQtoSQLLINQtoEntity)LINQCLR2.0之上,微软对C#3.0VB9.0而使其可以将LINQ编写的程序编译为可以被CLR2.0的JIT所理解的MSIL。LINQ技术的基础自动属 隐式类 对象集合初始化 扩展方 LambdaLambda自动自动属 1publicclassCustomer2 publicintId{get;set; publicstring{get;set;}5在我使用LINQ在使用LINQ获取数据的过程中我们常常需要使用selectnew语句查询出一个对(往往是IEnumerable类型的)用于数据绑定。在一般情况下如果是直接绑定(如直接将查询结果赋给一个Gridview控件的DataSource属性)我们可以直接selectnew来返回一个 必须使用selectnewclass-name这样的语言返回一个类的对象,大部分情况下隐式类这个名称可能对你很陌生,但是var这个关键字应该都用过,在C#中使用var 另外var关键字也用于 varLINQObjectIQuerabl类型的对象,也可能是一个简单的实体类型的对象。这时使用var对象初始化器与集合初始化在.NET2.0然后对其属性进行赋值。在.NET3.5/C#3.0象初始化器。这个特性也是类的一个基础,所以放在类之前介绍。 1Useruser=newUser{Id=1,Name="YJingLee",Age=22嵌套使用 1Useruser=newUser2{ Id=1, Name="YJingLee", Age22,22, Address=newAddress { City="NanJing", }11通过Add1List<int>num=newList<int>{0,1,2,6,7,8,9结合对象初始化器,我们可以写出如下简洁的代码 1List<User>user=newList<User>{2 User{Id=2,Name="XieQing",Age=25},4};还是前文提到的selectnewclass-name类或new[]{object,…}来初始化一 类或不确定类型类的对象需要使用varinitializer{1varp1=new{Id=1,Name="YJingLee",Age=22还是同上面的例子提到的当直接使还是同上面的例子提到的当直接使用selectnew{objectinitializer}这样的语法就是将一个LINQ查询的 扩展方这个类现有封装的前提下又可以为其添加LINQ扩展方法使用上类似于静态方法,但在本质上其是实例方法。这是由于.NET3.5所以语言不可能做很大 ,这一切都是语法糖()1publicstaticclassExtensions2{3 publicstaticbool Address(thisstrings)4 Regexregex=new }8} Address())2 Response.Write("YJingLee提示:这是1if正确的邮件地址");4LambdaLambda表达Lambda表达式是对.NET2.0 方法在语法形式上的进一步改进,仍然以代码说明1varinString=list.FindAll(delegate(strings){returns.Indexof("YJingLee")>=0;});使用Lambda表达式代码将更自然易懂 1varinString=list.FindAll(s=>s.Indexof("YJingLee")>=可以看出,Lambda可以看出,Lambda.NET中的数这一部分介绍.NET中不同的数据 层的使用方式,由此得出EntityFramework在一个.NET系统中的 手写代码通过ADO.NET2.0连接类与数据库交 ORM组 DataSetDataSet方最基本的Dataset数 的实现使用下图表示如图所示,DataSet与数据源之间通过DataAdapter连接,逻辑中直接 DataSet获取数据,或是通过ADO.NET2.0的非连接类,或者通过强类型DataSet以一种类型安全的方式 缺点逻辑代码与数 代码耦合高改进DataSet方这种设计方式将业务所需的实体抽象出来,并把对DataSet的操作封装在其中,这样一定程序上解除业务 手写代码通过ADO.NET2.0连接类与数据库交 ORM–LINQto在.NET平台在.NET平台下ORM的解决方案有不少,本文只讨论两个微软 的解决方案。先是LINQtoSQL技术。LINQtoSQL是一个将不再更新的技术。其有很多不足之处,如,不能灵活的定义对象模型与数据表之间的映射、无法扩展提供程序只能支持SQLServer等。这样数 层的设计如下所示ORM–ADO.NETEntity 由图可以看出,使用EntityFramework可以充分的定义与数据库表映射的实体,并将这个实体直接用于创建ComplexType(CSDL部分有讨论 些大同小异的代码,并且对这个实体模型(包含于EDM)可以在运行时修改并生效。另外,开发人员库的操作。下文将详细讨论上图所示的EDM。深入了解EntityEntityFramework–EDM(EntityEDM概实体数据模型,简称EDM,由三个概念组成。概念模型由概念架构定义语言文件(.csdl)来定义,映射由映射规范语言文件(.msl),模型(又称逻辑模型)由架构定义语言文件(.ssdl)来定义。这三者合在一起就是EDM模式。EDM.edmx的文件。这个包含EDM的文件可以使用VisualStudio中的EDM设计器来设计。由于这个文件本质是一个xml文件,可以手工编辑此文件来自定义CSDLMSLSSDLxml这个设计器生成的文件的注释可以使你很清楚的明白这个EDM明这是一个xml1<?xmlversion="1.0"encoding="utf-以下这一行是EDM的根节点,定义了一个表明版本的属性及这个EDM使 名空间 1 接下来由注释可以看到接下来由注释可以看到EDMEDM的,第二部分用于实体设计器,这一部第一部分点<edmx:Runtime>EDMCSDL定义了EDM或者说是整个程序的部分–概念模型。当前流行的软件设计方法通常都是由设计一个最根本的组成部分,其体现了现实世界中对象作为一种计算中可以表示的对象设计方法。而EDM的CSDL就是要达到这样一个目的。这个在下文介绍EntityFramework优点时另有说明。于.NETFramework中的类型。下面xmlelement来自作业提交系统(有删节):1<!--CSDLcontent-->2<edmx:ConceptualModels>3<SchemaNamespace="ASSModel"Alias="Self" /ado/2006/04/edm">4 Name="ASSEntities">5 <FunctionImportName="GETHOUSEWORKDONE"EntitySet="UpAssignments"ReturnType="Collection(Self.UpAssignments)">6<ParameterName="StuID"Type="Int32"Mode="In"/>7 "Type="Int32"Mode="In"/>8 Type="String"Type="String"Mode="In" 过程-->1112 <EntitySetName="Assignments"EntityType="ASSModel.Assignments"/>13 <EntitySetName="Classes"EntityType="ASSModel.Classes"/>14 <EntitySetName="Courses"EntityType="ASSModel.Courses"/>15 <EntitySetName="SetCourses"EntityType="ASSModel.SetCourses"/>16 <EntitySetName="Students"EntityType="ASSModel.Students"/>17 <EntitySetName="Teachers"EntityType="ASSModel.Teachers"/>18 <EntitySetName="UpAssignments"EntityType="ASSModel.UpAssignments"/>19 Name="FK_SetCourses_Classes"Association="ASSModel.FK_SetCourses_Classes">21<EndRole="Classes"EntitySet="Classes"/>22 <EndRole="SetCourses"EntitySet="SetCourses"/>23 <!--以上删节–6个关系集-->25 </EntityContainer>2728 <!--以下保留一个EntityType作为示例-->29 <EntityTypeName="Students">30 Name="StuID"/>32 <PropertyName="StuID"Type="Int32"Nullable="false"/>34 <PropertyName="StuName"Type="String"Nullable="false"MaxLength="10"Unicode="true"FixedLength="true"/>35<PropertyName="Pswd"Type="String"Nullable="false"MaxLength="50"Unicode="false"FixedLength="true"/>36 ToRole="Classes"/>37 <NavigationPropertyName="UpAssignments"Relationship="ASSModel.FK_UpAssignments_Students"FromRole="Students"ToRole="UpAssignments"/>38 </EntityType>3940 <!--仅保留与上文AssociationSet对应的Association-- <EndRole="Classes"Type="ASSModel.Classes"Multiplicity="1"/>43 <EndRole="SetCourses"Type="ASSModel.SetCourses"Multiplicity="*"/>44 </Schema>46这部分XML文档,Schema这部分XML文档,Schema是CSDL的根元素,其中定义的Namespace是用于ObjectContext与 在此Schema内的Element均可以该Alias作为Namespace的别名。Alias的使用可以参考如下xml1在这个根元素的内部的文档结构第一部分–实体容器大致如下 1<EntityContainer <FunctionImport <EntitySet<AssociationSet/>5下面的表格说明了这些节点及其属性的作 EntityContainerObjectContextObjectContext内与此EntityObjectContext内与此Entity有两个End对应到Association中End节的Role属性,起到将AssociationSet详见过程设计部其中的其中的EntitySet或AssociationSet可以共享Entity或Association的定义。接下来看一下CSDL,Entity与Association首先是Entity:1<EntityTypeName="Students">2<Key> <PropertyRefName="StuID"/></Key>5<PropertyName="StuID"Type="Int32"Nullable="false"/>6 Name="StuName"Type="String"Nullable="false"MaxLength="10"Unicode="true"FixedLength="true"/>7<PropertyName="Pswd"Type="String"Nullable="false"MaxLength="50"Unicode="false"FixedLength="true"/>8<NavigationPropertyName="Classes"Relationship="ASSModel.FK_Students_Classes"FromRole="Students"ToRole="Classes"/>9<NavigationPropertyName="UpAssignments"Relationship="ASSModel.FK_UpAssignments_Students"FromRole="Students"ToRole="UpAssignments"/>10</EntityType>下表说明了其属性及其子节点与子节点的属性的含义 EntityClass对应的1<!--仅保留与上文AssociationSet对应的Association-->2<AssociationName="FK_SetCourses_Classes">3<EndRole="ClassesType="ASSModel.Classes"Multiplicity="1"/>4<EndRole="SetCourses"Type="ASSModel.SetCourses"Multiplicity="*"/>5</Association>这一节符合以下结构 1<Association> <End/> <ReferentialConstraint> <PropertyRef/> </Principal> <Dependent><PropertyRef/> 属性及其子元素属性的说明 类似于AssociationSet,AssociationEndEnd此End的Role,与AssociationSet的End的Role0、1对应于End中的对应于End中的在在EDMxml通过手工编辑xml实体,而这个实体又能良好的与模型映射起来,由于数据库不支持地址这种类型,所以我们可以将地来完成复杂类型的创建与映射。这部分示例将在介绍MSLEDM1<!--SSDLcontent-->2<edmx:StorageModels> Namespace="ASSModel.Store"Alias="Self"Provider="System.Data.SqlClient"ProviderManifestToken="2008"xmlns:store=" /ado/2006/04/edm/ssdl">4<EntityContainerName="ASSModelStoreContainer">5 Schema="dbo"/>6 <!--7EntitySet的定义-->7</EntityContainer>8 7个EntityType<EntityType<EntityType "<Property"Nullable="false"StoreGeneratedPattern="Identity"/>15 Name="AssName"Type="nchar"Nullable="false"MaxLength="20"/>16<PropertyName="AssDes"Type="nvarchar"MaxLength="500" Name="SCID"Type="int"Nullable="false"/>18 Type="datetime"Nullable="false"/>19 <PropertyName="QuesFileName"Type="nvarchar"MaxLength="500"/>20 <PropertyName="QuesFileUrl"Type="nvarchar"Nullable="false"MaxLength="500"/>21 <!--保留与CSDL中对应的Function-- Name="GETHOUSEWORKDONE"Aggregate="false"BuiltIn="false" ParameterTypeSemantics="AllowImplicitConversion"Schema="dbo">25<ParameterName="StuID"Type="int"Mode="In"/>26 "Type="int"Mode="In"/>27 <ParameterName="Semester"Type="varchar"Mode="In"/>28 看文档的结构,SSDL与看文档的结构,SSDL与CSDLEntityTypeSSDL的特定于的查询语DefiningQuery(EDM)DefiningQuery(EDM)内的客户端投影映射到数据视图的查询。此类映射是只读的。也就是说如果想要更新此类EntitySet,需要使用下文介绍过程时提到的定义更新实体的过程的方法,使用定义的过程来更新这样的EntitySet。当在实体类设计器中导入无主键的表时,会自动生成此类使用DefiningQueryEntitySetEntityFramework定义过程,需要给数据表添加一个适当的主键,删除DefiningQuery节点并更新数据模型。EDM这个文件即上面所述的CSDLSSDL的对应,主要包括CSDLSSDL1<!--C-Scontent-->2s>3Space="C- :CS"> StorageEntityContainer="ASSModelStoreContainer"CdmEntityContainer="ASSEntities">5 TypeName="IsTypeOf(ASSModel.Assignments)">7 FragmentStoreEntitySet="Assignments">8 Name="QuesFileName"ColumnName="QuesFileName"/>9 Name="AssDes"ColumnName="AssDes"/>10 <ScalarPropertyName="A "/>11 <ScalarPropertyName="AssName"ColumnName="AssName"/>12 <ScalarPropertyName="Deadline"ColumnName="Deadline"/>13 <ScalarPropertyName="QuesFileUrl"ColumnName="QuesFileUrl"/>14 若干-->1819 <!--保留对应于CSDL与SSDL的 -->20 FunctionName="ASSModel.Store.GETHOUSEWORKDONE"/>21 Name="FK_UpAssignments_Assignments" <EndProperty<ScalarProperty<ScalarProperty"" 省略 >33 省略 >33如上代码所示,MSL个),每一个,其中可以包含多个(对应着两个分别来自CSDLSSDL的EntityContainer 就是描述这两个EntityContainer --1 StorageEntityContainer=""CdmEntityContainer="">2> > Fragment><ScalarProperty/> Fragment> > <InsertFunction/><DeleteFunction <UpdateFunction >1415 <ScalarProperty </EndProperty>19 >20 />22</EntityContainerMap 同上文,下面列出这些节点的属 SSDL中的EntityContainerCSDL中的EntityContainerEntityContainer中每个EntitySetEntitySetMap的名描述CSDL中EntityTypeSSDL中EntityTypeEntityTypeMap的名对应CSDL内EntityIsTypeOf(<名称>)注:这个类及其子类将共享此EntityTypeMapMapSSDL中的EntitySet(由于CSDL中一个EntitySetSSDLCSDLSSDL值CUD对应的过InsertFunction/UpdateFunction/Entity描述CSDL中的AssociationSetSSDL中的AssociationSetMap的名SSDL中EntitySetCSDL中AssociationSet一个AssociationSetMap中有两个分别对应CSDL中两个EndEndPropertyCSDLSSDLC/D对应的过InsertFunction/用于描述CSDLSSDL(详见1MapFragmentStoreEntitySet明中所说,其描述了CSDL的EntitySSDL的Entity的名称。这是实现下文EDM二条将一个概念模型的实体映射到多个模型的实体的关键设置。说明说明2:Contain这个元素及其属性的作用是,当多个概念模型实体映射到一 模型实体时,该元的属性决定了在什么情况下一个概念模型实体映射到指定 模型实体说明3:QueryView元素定义概念模型中的实体与 计算的EntitySQL查询定义此查询视图映射,并以概念模型中的实体表达结果集。同DefiningQuery定义的查询。此映射也是只读的。就是说如果想要更新此类EntitySet,也需要使用下文介绍 过程来更新这样的EntitySet。当多对多关联在 表在AssociationSetMap 义一个QueryView元素。定义查询视图时,不能在AssociactionSetMap StorageSetName属性。定义查询视图时,AssociationSetMap 元素不能同时包含EndPropertyEDMCSDL中的FunctionImport元素,其属性及说明如下所示 (在程序中调用的)参数的传递方式(InOut或SSDL中的Function 是否为聚合函数(过程是否为内建过是否为无参数过True为自定义函数,False为过MSL中的 CSDLFunctionImportSSDLFunctionElement这面总结的是用于返回实体对象的查询这面总结的是用于返回实体对象的查询 过程)下面分别描述一下有关修改操作 过程的使用 使用插入、更新或删除实体数据使用插入、更新或删除实体数据 过程,需EntityContainer中每个EntitySet描述CSDL中EntityTypeSSDL中EntityTypeCUD对应的过InsertFunction/UpdateFunction/描述CSDL中的AssociationSetSSDL中的C/D对应的过InsertFunction/EDMEDMComplexType再谈ComplexType,上文大致介绍了复杂类型的概念及作用,现在开始看一下具体怎样实现。前文已经提到实现复杂类型关键是在CSDL与MSL,而与SSDL无关。首先应该在CSDL中怎加这样一节,此节与<EntityType></EntityType>1<ComplexType> <Property/>3节点及其属性含义如下 然后在MSL中 Fragment>下与<ScalarProperty/>同级的位置添加如下节 1<ComplexProperty> <ScalarProperty/>3具体的节及其属性含义如下 CSDLComplexTypeCSDLSSDL实实体数据模型映射方实体框架支持各种方式用于在实体数据模型(EDM)中将概念模型映射到关系数据。有关 见实体框架中的数据建模。实体框架当前支持以下实体数据模型(EDM)映射方案。12其设计方式见EDMMSL13使用场合:使一个概念模型的实体映射到不同数据源的模型的实体另见:EDMMSL245MSL中的Conditon来决定映射关系,见EDM之MSL2。5见EDM之MSL2678其设计方式见EDMMSL19在此方案中,模型中的过程映射到概念模型中的FunctionImport元见上文过程部见上文过程部在此方案中,在模型中定义表示数据源中的表的查询。在映射到SQLServer数据库时,查询以数据源的本机查询语言(如Transact-SQL)表示。上文EDM之SSDL映射。此映射基于对模型进行的EntitySQL查询定义。上文EDMMSL多对多关联。关联的两端都映射到模型中的表自关联。此映射支持具有相同类型的两个实体之间的关联,如一个与另一个Employee之间的关联。EntityEntityFramework发送到数据库的SQL语句等)。我们唯一能做的是操作EDM,EDM会将这个操作请求发往数据库。EntityFramework实现了一套类似于ADO.NET2.0中连接类(它们使用方式相同,均基于Provider模式)的被称作EntityClient的类用来操作EDM。ADO.NET2.0SQL表或视图,而EntityClient是向EDM发送EntitySQLEntity。EntityClient在EntityFramework的作用是相当重要的,所有发往EDM的操作都是经过EntityClient,包括使用LINQtoEntity进行的操这几 方式使用介绍如下:(部分示例代码来源MSDN 1stringcity="London";2using(EntityConnectioncn=newEntityConnection("Name=Entities"))3{4cn.Open();5 mandcmd= mand();6 mandText=@"SELECTVALUEcFROMEntities.CustomersAScWHERE7 c.Address.City=@city";8cmd.Parameters.AddWithValue("city",city);9DbDataReaderrdr=cmd.ExecuteReader(CommandBehavior.SequentialAccess);10while(rdr.Read())11 ine(rdr["CompanyName"].ToString());12rdr.Close();13} 在有在有EntityClient+EntitySQL这种使用方式下,使用ObjectService+EntitySQL会得到任何编辑时或运行时的好处。在ObjectContext下使用EntitySQLLINQtoEntity示例代码 1stringcity="London";2using(Entitiesentities=newEntities())3{4ObjectQuery<Customers>query=entities.CreateQuery<Customers>(5 VALUEcFROMCustomersAScWHEREc.Address.City=@city",6 ObjectParameter("city",city)7);89foreach(Customerscinquery)10 panyName);11}ObjectContext+LINQ(to 11stringcity="London";2using(Entitiesentities=newEntities())3{wherewherec.Address.Cityvarquery=fromcinentities.Customersselectc;78foreach(Customerscinquery)city panyName);101stringcity="London";2using(Entitiesentities=newEntities())3{4varquery=entities.Customers.Where(r=>r.Address.City==city);56foreach(Customerscinquery)7 panyName);8}entities.Customer2ObjectQuery<Customers>来进行查询(关于此可以参见EDMxxx.designer.cs)WhereLambdaEntitySQL语句做参数来将LINQ与EntitySQL1stringcity="London";2using(Entitiesentities=newEntities())3{4varquery=entities.Customers.Where("r.Address.City='"+city+"'");56foreach(Customerscinquery)7Console.Wriine(panyName);8}使用技巧及需要注意的问 样使用的优势,但是如下两种情况下使用EntitySQL可能是最好的选择。当查询条件的个数固定时,我们也可以采用罗列多个Where扩展方法的形式,如条件组合为EntitySQL并传递给Where()方法。数据库模糊查 下面代码演示使用EntitySQLlikecontext.Customer.Where("it.CustomerIDLIKE@CustomerID",newcontext.Customer.Where(r=>这个并不是只能使用EntitySQLLINQtocontext.Customer.Where(r=>同理,"V%"、"%VStartsWith()与EndsWithLINQtoEntityToListToArrayLINQtoObjects来处理,否则处在EntityFramework几种方法的性能分析及使用选EntityClient直接提供给EntityDataProvider的EntitySQL还是通过ObjectService传递的EntitySQL(或是LINQtoEntity),都在EntityClientDataProviderCommandTreeSQL。这样来看使用LINQtoEntity与EntitySQL的效率应该差不多,但是还有一个问题,那就是EntitySQL所SQLLINQtoEntitySQLLINQtoEntitytoEntity还是有很大差距。另外在ObjectServiceEntityClient进行临时查询建议选择EntityCLient,如果是操作数据那只能采用ObjectService。EntityClient和实体对象服务和实体对象服务和定向到EntityClient提供程序是否否是是否可直接发出否否否否否是否是是EntityClient和实体SQL制,而使用LINQtoEntity可以获得最佳的编辑时支持。其它操EDM的方通过EdmGen更灵活的控制在.NETFramework3.5的文件夹下有一个名为EdmGen的工具,VisualStudio的实体设计器就是调用这个工具来完成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:</provider:<字符串>用于ssdl生成的Ado.Net/connectionstring:/incsdl:<文件>/incsdl:<文件>从 概念模型的文/refcsdl:<文件>包含/incsdl文件所依赖的类型的csdl文件/inmsl:<文件>/inmsl:<文件>从 映射的文/inssdl:<文件>从 模型的文/outcsdl:/outmsl:</outssdl:<文/outssdl:<文件>将生成 模型写入到其中的文/outobjectlayer:</outviews/language:CSharp使用C#语言生成代码/language:VB使用VB语言生成代码/namespace:<字符串>用于概念模型类 名空间名/entitycontainer:<字符串>用于概念模型中的EntityContainer的名称/help/nologo取消/nologo取消显 消从Northwind示例数据库生成完整EntityModel1EdmGen/mode:FullGeneration/connectionstring:"server=.\sqlexpress;integratedsecurity=true;从ssdl文件开始生成EntityModel 1EdmGen/mode:FromSSDLGeneration/inssdl:Northwind.ssdl验证EntityModel 1EdmGen/mode:ValidateArtifacts/inssdl:Northwind.ssdl为为什么要使用EntityFramework,限制条件及当前版本框架的问优 423EntityFramework以把实体类的定义由一个单独的项目使用C#classxml到数据层。加载程序集。现在可以通过动态更改EDMSSDL,(如果数据库的表明有变动,也只需多修改MSL),对CSDL没有任何影响,从而也不需要对程序的BLL等上层部分做任何改动。条 要想让一个数据库支持要想让一个数据库支持EntityFrameworkEntityClientDataProvider,这样才能将EntitySQLSQL并交由ADO.NET数据库还需要提供ADO.NETDataProvider。缺 EntityEntityFrameworkEntitySQLSQL方式属于解释性转换,性能较差。另外EntityFramework在每次应用启动时需要EDM,这个过程较EDM由于当前的EntitySQLDML操作,所以当前版本的EntityFramework需要通过ObjectService来完成。在EDM的设计器文件xxx.designer.cs中自动生成了一些签名为voidAddToEntity(EntityTypeentities.SaveChanges()方法将修改保存回数据库,这是所有三种更新操作所需的。更新与删除操作都需要先使用ObjectServiceentit

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论