随笔分类 -  Entity Framework 4 In Action读书笔记

摘要:本章内容包括 理解并发问题 配置并发 处理并发异常 处理事务 假设你想在网上订机票。查询你的航班,发现还有座位,但是当你单击预订按钮时,系统提示机票已售罄。如果再次查询该航班,发现已经没有座位了。这是怎么回事呢?原来是在你查询到结果和预订之间,其他人预订了最后一张票。系统对最后一张票进行了并发查询,如果没有并发检查,该航班的机票就会超额预订。 本章将深入并发和事务处理。现在我们先来了解什么是并发... 阅读全文
posted @ 2011-11-13 15:43 BobTian 阅读(5168) 评论(3) 推荐(5) 编辑
摘要:7.4 持久化的一些技巧持久化过程中的很多东西都有可能引起错误,如字符串太长,违反外键约束,不为空的列设置为null,重复键等等。这些都是引发异常的典型原因。让我们看看如何在代码中处理这些异常吧。7.4.1 处理持久化异常一般来说,处理异常很简单,在try/catch块中调用SaveChange即可。由EF引起的异常也是如此,但是要捕捉一个特定的异常:UpdateException。UpdateE... 阅读全文
posted @ 2011-11-12 15:15 BobTian 阅读(2901) 评论(0) 推荐(0) 编辑
摘要:7.3 持久化实体关系图持久化order涉及对多个实体的操作。尽管只更新order和它的details,但是order的customer和details中的products作为只读数据同样会被涉及到。因为涉及到多个实体,我们就要谈谈实体关系图(entities graph)或者对象关系图(objects graph)。7.3.1 持久化Added状态的实体关系图当保存order时,持久化过程就会被触发,下面是你必须要做的:创建Order的一个实例。关联Order和一个Customer。创建OrderDetail的一个实例。关联OrderDetail和一个product。添加OrderDetai 阅读全文
posted @ 2011-11-11 12:23 BobTian 阅读(2491) 评论(3) 推荐(2) 编辑
摘要:7.2 持久化修改的实体到数据库持久化单个实体到数据库有三种方式:持久化为一个新行。使用属性更新一个存在的行。使用键值属性(key properties)删除一个存在的行。7.2.1 持久化为一个新行 首先,添加客户。非常简单:使用AddObject方法,传递一个Customer实例,然后调用SaveChanges。因为主键属性是identity,所以没有必要设置它的值;如果设置了,值也会被忽略。... 阅读全文
posted @ 2011-11-09 14:47 BobTian 阅读(2589) 评论(7) 推荐(2) 编辑
摘要:本章内容包括持久化修改的对象到数据库持久化复杂对象图到数据库带有外键和独立关联的持久化本章,我们讨论如何在连接和断开连接的情况下插入、更新和删除实体。包括单个对象的更新,例如一个customer和复杂关系图的更新,例如一个order和它的details。本章结束的时候,你就可以使用EF处理更新了。让我们开始讨论持久化过程是如何工作的吧。7.1 使用SaveChanges持久化实体实体持久化是存储实... 阅读全文
posted @ 2011-11-08 10:50 BobTian 阅读(3759) 评论(2) 推荐(3) 编辑
摘要:objectstatemanager更改跟踪管理 ObjectStateManager组件(从现在开始称之为 state manager)负责与上下中对象追踪有关的一切: 1.当添加,附加到上下文或者从上下文中删除一个实体,实际上是对state manager做的这些。 2.当我们说上下文保留从数据库中读取的所有实体集合在内存中时,其实是state manager保存这些数据。 3.当上下文执... 阅读全文
posted @ 2011-11-07 22:02 BobTian 阅读(5954) 评论(0) 推荐(4) 编辑
摘要:管理实体状态 上下文仅仅自动处理Unchanged状态到Modified状态的转变。其他的状态转变必须使用适当的方法显示处理: AddObject——在Added状态时给上下文添加一个实体。 Attach——在Unchanged状态时附加一个实体到上下文。 ApplyCurrentValues和ApplyOriginalValues——改变状态为Modified,将追踪的实体与另一个比较。 D... 阅读全文
posted @ 2011-11-07 08:37 BobTian 阅读(4471) 评论(6) 推荐(2) 编辑
摘要:本章内容包括: 理解实体状态理解状态的转换自动和手动改变状态我们先从分析实体的生命周期和它的状态开始。实体生命周期在其生存期期间,一个实体只有一个状态。在了解如何检索状态之前,先看看什么是实体状态。实体状态就是声明为以下值的System.Data.EntityState类型的枚举:Added——实体标记为added。 Deleted——实体标记为deleted。 Modified——实体已经被修改... 阅读全文
posted @ 2011-10-30 20:28 BobTian 阅读(2688) 评论(1) 推荐(2) 编辑
摘要:映射继承OrderIT使用两种继承策略:每个层次结构一张表(table per hierachy(TPH))每个类型一张表(table per type(TPT))。数据库不支持继承,但是使用这些继承策略,可以模拟这一行为。我们先从TPH策略开始。TPH继承TPH将所有的数据保存在一个表中,使用一个或多个字段的值来识别每行记录所属的类型。在OrderIT中,Customer和Supplier类被持... 阅读全文
posted @ 2011-10-28 22:26 BobTian 阅读(2596) 评论(6) 推荐(2) 编辑
摘要:在模型中定义关系 在OrderIT模型中,有三种类型的关联:one-to-one,one-to-many和many-to-many。 One-to-one 关系 one-to-one关系的典型例子是订单详细(order detail)和订单(order)。创建这种类型的关联一点也不困难,但是涉及几个步骤: 1. 通过添加导航属性修改OrderDetail类。如果选择外键关联,还必须加上外键... 阅读全文
posted @ 2011-10-28 14:58 BobTian 阅读(2561) 评论(1) 推荐(1) 编辑
摘要:本章内容包括:介绍EDM(Entity Data Model)创建EF域模型类 描述类 描述数据库 映射类到数据库首先,让我们讨论一下EDM。Entity Data ModelEntity Data Model(EDM)是EF的核心。事实上,EF就是在对象模型(Ojbect Model)和数据库之间创建一个抽象层,用来降低两者的耦合度的工具。应用程序只与对象模型类发生作用而忽略数据库的存在,正是E... 阅读全文
posted @ 2011-10-27 18:12 BobTian 阅读(5672) 评论(2) 推荐(0) 编辑
摘要:4.9 加载(Fetching) 预先加载指在一个查询中加载所有的实体和关联的数据。延迟加载指使用时再加载关联的实体。预先加载是检索数据最高效的方法。尽管它从数据库中检索所有的数据,但是只访问一次数据库,避免了延迟加载与数据库的频繁通信。 4.9.1 预先加载 预先加载通过ObjectQuery类的一个特殊方法:Include实现。这个方法接受一个字符串,表示要加载的导航属性。这个字符串被称... 阅读全文
posted @ 2011-09-21 14:14 BobTian 阅读(4021) 评论(12) 推荐(1) 编辑
摘要:4.8 执行手动查询 有很多原因决定你会手动写查询。或许由EF生成的SQL太慢,又或许执行起来浪费了太多资源。另一种情况可能是当你动态生成一个如此复杂的查询,创建SQL代码比使用LINQ to Entities简单。 在这种情况下,你自己可以使用ObjectContext类的ExecuteStoreQueryT创建一个SQL命令。它允许你发出任意的查询并将查询结果映射到类。它的使用如下: ... 阅读全文
posted @ 2011-09-16 21:54 BobTian 阅读(2736) 评论(3) 推荐(0) 编辑
摘要:4.7 使用函数 扩展LINQ to Entities查询的简便方法就是使用函数。有四种类型的函数可以应用: 规范函数—LINQ to Entities本身没有提供的一组预定义的函数。 数据库函数—一组预定义的SQL Server函数。 模型中定义的函数—存储在EDM中的用户定义的实体SQL函数。 自定义数据库函数—可以在查询中使用的用户定义的数据库函数。 在这部分,只涉及到规范函数和数据库函数... 阅读全文
posted @ 2011-09-16 19:58 BobTian 阅读(3292) 评论(2) 推荐(0) 编辑
摘要:继承引入了多态查询的概念。这种类型的查询认为继承层次结构和返回的对象可能是不同类型,但是继承自相同的基类。假设你想查询所有的产品。从多态查询获得的是Product对象列表,但具体的类型是Shirt或者Shoe,因为引擎自动实例化为正确的类型。你不仅可以自动得到正确的类型,还可以根据类型应用过滤。例如,你可以只查询鞋子或者只查询衬衫。我们敬爱的beta测试用户终于对OrderIT订单的展示满意了,现... 阅读全文
posted @ 2011-09-03 21:48 BobTian 阅读(2889) 评论(8) 推荐(2) 编辑
摘要:4.4排序(Sorting)基本需求:用户想数据根据送货城市和邮政编码排序。解决方案:知道LINQ有一个扩展方法可以根据一个或多个属性排序你一定会很高兴。LINQ to Entities提供了这个方法的实现也一点也不奇怪。在C#中,使用orderby子句。这个子句接受要根据排序的属性。默认情况下,是升序,但是可以在属性后边加上关键字descending实现降序。如果有多个属性是降序,你可以在每个属... 阅读全文
posted @ 2011-09-03 08:57 BobTian 阅读(2892) 评论(1) 推荐(1) 编辑
摘要:4.3 分组数据基本需求:根据送货城市分组返回所有订单。解决方案:在查询中使用group ... by ...子句。结果类型有点复杂,因为它是IEnumerableIGroupingstring, Order的对象。IGrouping是一个特殊的类,它有一个键(Key)属性,在本例中是送货地址的值,和一个值(Value)属性。值属性是一个IEnumerableT集合,它包含对应Key的... 阅读全文
posted @ 2011-09-02 20:04 BobTian 阅读(4468) 评论(16) 推荐(4) 编辑
摘要:4.2 投影结果基本需求:用户只想查看订单日期和送货地址解决方案:为每个订单提取出所有的数据浪费资源,在本例中,仅仅需要一部分数据,你需要的是订单的投影。LINQ to Entities有一个投影方法:Select。我们看一个例子,查询所有订单的ID,日期和送货地址。新需求:在一个表格列里查看地址信息。4.2.1关联投影单一关联投影需求:在表格列中显示顾客的信息。然而检索顾客所有的信息是没必要的,... 阅读全文
posted @ 2011-08-23 17:08 BobTian 阅读(3092) 评论(6) 推荐(2) 编辑
摘要:本章所有的例子都是在第二章OrdeIT结构的基础上完成的。4.1 筛选数据基本需求:根据送货城市查询订单。解决方案:使用LINQ的Where方法添加过滤功能。下面代码查询送货到New York的所有订单。新需求:查询多个送货城市的订单。下面代码查询送货到New York和Seattle的所有订单。如果按照上面的方法查询多个送货城市的订单是不合适的,因为提前并不知道要查询多少个城市的订单,更好的解决... 阅读全文
posted @ 2011-08-21 19:06 BobTian 阅读(3679) 评论(6) 推荐(4) 编辑
摘要:三、对类进行查询因为数据库对EDM是完全抽象的,你可以完全忽略底层的数据库结构对类进行查询。EF使用映射信息转换查询成SQL。工作流如下:类和数据库之间的抽象不难理解。如果一个属性和数据表列的名称不匹配,你仍然可以在你的查询里使用属性名——这在类查询时非常明显。使用LINQ to Entities,你不太可能输入错误的名称,因为VS的智能提示给你提示正确的名称。更重要的是,如果你键入一个不正确的属... 阅读全文
posted @ 2011-08-19 12:08 BobTian 阅读(3535) 评论(7) 推荐(0) 编辑