随笔分类 -  Entity Framework

摘要:http://www.cnblogs.com/daxnet/archive/2010/07/19/1780764.html规约(Specification)模式 本来针对规约模式的讨论,我并没有想将其列入本系列文章,因为这是一种概念性的东西,从理论上讲,与EntityFramework好像扯不上关系。但应广大网友的要求,我决定还是在这里讨论一下规约模式,并介绍一种专门针对.NET Framework的规约模式实现。 很多时候,我们都会看到类似下面的设计: 隐藏行号 复制代码 ? Customer仓储的一种设计 public interface ICustomerRespository ... 阅读全文
posted @ 2011-10-31 12:36 quietwalk 阅读(684) 评论(0) 推荐(1) 编辑
摘要:http://dotnet.ysoho.com/Members-System.Data.Objects.ObjectContext.aspxObjectContext的构造函数 ObjectContext(EntityConnection)使用给定连接初始化ObjectContext 类的新实例。在构造过程中,从EntityConnection 对象提取元数据工作区。ObjectContext(EntityConnection, String)使用给定的连接和实体容器名称初始化ObjectContext 类的新实例。ObjectContext(String)使用给定的连接字符串和默... 阅读全文
posted @ 2011-10-31 11:16 quietwalk 阅读(1674) 评论(0) 推荐(0) 编辑
摘要:http://www.cnblogs.com/daxnet/archive/2010/07/10/1774706.html仓储的实现:深入篇 早在年前的时候就已经在CSAI博客发表了上一篇文章:《仓储的实现:基础篇》。苦于日夜奔波于工作与生活之间,一直没有能够抽空继续探讨仓储的实现细节,也让很多关注EntityFramework和领域驱动设计的朋友们备感失望。 闲话不多说,现在继续考虑,如何让仓储的操作在相同的事物处理上下文中进行。DDD引入仓储模式,其目的之一就是能够通过仓储隐藏对象持久化的技术 细节,使得领域模型变得更为“纯净”。由此可见,仓储的实现是需要基础结构层的组件支持的,表现为对数 阅读全文
posted @ 2011-10-31 11:12 quietwalk 阅读(512) 评论(0) 推荐(0) 编辑
摘要:http://www.cnblogs.com/daxnet/archive/2010/07/07/1772780.html仓储的实现:基本篇 我们先从技术角度考虑仓储的问题。实体框架(EntityFramework)中,操作数据库是非常简单的:在ObjectContext中使用 LINQ to Entities即可完成操作。开发人员也不需要为事务管理而操心,一切都由EF包办。与原本的ADO.NET以及LINQ to SQL相比,EF更为简单,LINQ to Entities的引入使得软件开发变得更为“领域化”。下面的代码测试了持久化一个 Customer实体,并从持久化机制中查询这个Cust. 阅读全文
posted @ 2011-10-31 10:37 quietwalk 阅读(449) 评论(0) 推荐(0) 编辑
摘要:http://www.cnblogs.com/daxnet/archive/2010/07/07/1772638.html模型对象的生命周期 - 仓储 上文中已经提到了管理领域模型对象生命周期的两大角色,即工厂与仓储,并对工厂的EntityFramework实践作了详细的描述。本节主要介绍仓储的概念,由于仓储的内容比较多,我将在接下来的两节中具体讲解仓储的架构设计与实践经验。 仓 储(Repository),顾名思义,就是一个仓库,这个仓库保存着领域模型的实体对象。在业务处理的过程中,我们有可能需要把正在参与处理过程的对象 保存到仓储中,也有可能会从仓储中读取需要的实体对象,抑或将对象直接从. 阅读全文
posted @ 2011-10-31 10:23 quietwalk 阅读(414) 评论(0) 推荐(0) 编辑
摘要:http://www.cnblogs.com/daxnet/archive/2010/07/07/1772615.html模型对象的生命周期 - 工厂 首先应该认识到,是对象就有生命周期。这一点无论在面向对象语言还是在领域驱动设计中都适用。在领域驱动设计中,模型对象生命周期可以简要地用下图表示: 通过上图可以看到,对象通过工厂从无到有创建,创建后处于活动状态,此时可以参与领域层的业务处理;对象通过仓储实现持 久化(也就是我们常说的“保存”)和重建(也就是我们常说的“读取”)。内存中的对象通过析构而消亡,处于持久化状态的对象则通过仓储进行撤销(也就是我 们常说的“删除”)。整个状态转换过程非.. 阅读全文
posted @ 2011-10-31 10:12 quietwalk 阅读(420) 评论(0) 推荐(0) 编辑
摘要:http://www.cnblogs.com/daxnet/archive/2010/07/07/1772606.html聚合 聚合(Aggregate)是领域驱动设计中非常重要的一个概念。简单地说,聚合是这样一组领域对象(包括实体和值对象),这组领域对象联合起来表 述一个完整的领域概念。比如,根据Eric Evans《领域驱动设计》一书中的例子,一辆车包含四个轮子,轮子离开“车”就毫无意义,此时这个联合体就是聚合,而“车”就是聚合根 (Aggregate Root)。 从实践中得知,并非领域模型中的每个实体都能够完整地表述一个明确的领域概念,就比如客户与送货地址的关系。假设在某个应用中,.. 阅读全文
posted @ 2011-10-31 10:04 quietwalk 阅读(509) 评论(0) 推荐(0) 编辑
摘要:http://www.cnblogs.com/daxnet/archive/2010/07/07/1772596.html存储过程 - 领域驱动的反模式 EntityFramework(EF)中有一项功能,就是能够根据数据库中的存储过程生成实体的行为(或称方法,以下统称方法)。我在本系列的第一篇博文中就已经提到,这种做法并不可取!因为存储过程是技术架构中的内容,而我们所关注的却是领域模型。 Andrey Yemelyanov在其“Using ADO.NET EF in DDD: A Pattern Approach”一文中,有下面这段话: In this context, the arc... 阅读全文
posted @ 2011-10-31 09:54 quietwalk 阅读(444) 评论(0) 推荐(0) 编辑
摘要:http://www.cnblogs.com/daxnet/archive/2010/07/07/1772593.html案例:一个简易的销售系统 从现在开始,我们将以一个简易的销售系统为例,探讨EntityFramework在领域驱动设计上的应用。为了方便讨论,我们的销售系统非常简 单,不会涉及客户存在多个收货地址的情况,也不会包含任何库存管理的内容。假设我们的系统只需要维护产品类型、产品以及客户信息,并能够帮客户下订单、跟 踪订单状态,以及接受客户退货。从简单的分析我们大致可以了解到,这个系统将会有如下实体:客户、单据、产品及其类型。单据分为销售订单和退货单两种,每 个单据可以有多个单据行 阅读全文
posted @ 2011-10-31 09:46 quietwalk 阅读(642) 评论(0) 推荐(0) 编辑
摘要:http://www.cnblogs.com/daxnet/archive/2010/07/07/1772584.html分层架构 在引入实例以前,我们有必要回顾,并进一步了解分层架构。“层”是一种体系结构模式[POSA1],也是被广大软件从业人员用得最为广泛而且最为灵活的模式之一。记得在CSDN上,时常有朋友问到:“分层是什么?为什么要分层?三层架构是不是就是表现层、业务逻辑层和数据访问层?” 到这里,你可能会觉得这些朋友的问题很简单,分层嘛,不就是将具有不同职责的组件分离开来,组成一套层内部高聚合,层与层之间低耦合的软件系统吗?不错!这是分层的目标。但是,我们应该如何分层呢? 领域驱动.. 阅读全文
posted @ 2011-10-31 09:42 quietwalk 阅读(614) 评论(0) 推荐(0) 编辑
摘要:http://www.cnblogs.com/daxnet/archive/2010/07/07/1772581.html从DataTable到EntityObject 虽然从技术角度讲,DataTable与EntityObject并没有什么可比性,然而,它暗示了一场革命正在悄然进行着,即使是微软,也摆脱不了这场革命的飓风。 软件设计思想需要革命,需要摆脱原有的思路,而走向面向领域的道路。你或许会觉得听起来很玄乎,然而目前软件开发的现状使你不得不接受这样的现实, 仍然有大帮的从业人员成天扯着数据库不放,仍然有大帮的人在问:“我要实现xxxx功能,我的数据库应该如何设计?”这些人犯了根本性的错. 阅读全文
posted @ 2011-10-31 09:31 quietwalk 阅读(1011) 评论(0) 推荐(0) 编辑
摘要:http://www.west-wind.com/weblog/posts/2008/Feb/05/Linq-to-SQL-DataContext-Lifetime-ManagementLinq to SQL uses a DataContext to manage it's access to the database as well as tracking changes made to entities retrieved from the database. Linq to SQL has a persistent approach to managing its 'c 阅读全文
posted @ 2011-10-25 19:52 quietwalk 阅读(1126) 评论(0) 推荐(0) 编辑
摘要:目录 预备知识2 LINQ技术2 LINQ技术的基础 - C#3.02 自动属性2 隐式类型2 对象初始化器与集合初始化器3 匿名类3 扩展方法4 Lambda表达式4 .NET中的数据访问4 DataSet方案5 改进的的DataSet方案5 手写代码通过ADO.NET2.0连接类与数据库交互5 ORM – LINQ to SQL6 深入了解Entity Framework7 Entity Framework的核心 – EDM(Entity Data Model)7 EDM概述7 EDM之CSDL7 EDM之SSDL11 EDM之MSL12 EDM中存储过程的设计15 EDM中Complex 阅读全文
posted @ 2011-08-12 11:05 quietwalk 阅读(780) 评论(0) 推荐(0) 编辑
摘要:本节,我们将介绍一些改善EF代码的方法,包括编译查询、存储模型视图以及冲突处理等内容。 l CompiledQuery 提供对查询的编译和缓存以供重新使用。当相同的查询需要执行很多遍的时候,那么我们可以使用ComplieQuery将查询的语句进行编译以便下次使用,这样可以免去对同一语句的多次处理,从而改善性能。 示例代码如下: [Test] public void ComplieTest() { using (var db = new NorthwindEntities1()) { //对查询进行编译 var customer = CompiledQuery.Compile<Northw 阅读全文
posted @ 2011-07-02 17:10 quietwalk 阅读(432) 评论(0) 推荐(0) 编辑
摘要:本节,我们将介绍一些改善EF代码的相关方法,如NoTracking,GetObjectByKey, Include等。 l MergeOption.NoTracking 当我们只需要读取某些数据 而不需要删除、更新的时候,可以指定使用MergeOption.NoTracking的方式来执行只读查询(EF默认的方式是AppendOnly)。 当指定使用NoTracking来进行只读查询时,与实体相关的引用实体不会被返回,它们会被自动设置为null。因此,使用NoTracking可以提 升查询的性能。示例代码如下: [Test] public void NoTrackingTest() { usi 阅读全文
posted @ 2011-07-02 17:09 quietwalk 阅读(628) 评论(0) 推荐(0) 编辑
摘要:在EF中,各个实体的插入、更新和删除也都通过使用存储过程来完成,以便提高点性能。这个类似于数据集。其步骤是:先定义存储过程,然后在VS的可视化设计器,设置存储过程映射即可。 下面,以为Supplier实体映射存储过程为例。 分别建立插入、更新和删除存储过程。 InsertSuppliers存储过程定义如下: CREATE PROCEDURE [dbo].[InsertSuppliers] -- Add the parameters for the stored procedure here @CompanyName nvarchar(40), @ContactName nvarchar(30) 阅读全文
posted @ 2011-07-02 17:08 quietwalk 阅读(354) 评论(0) 推荐(0) 编辑
摘要:从Code MSDN上下载下来的EFOracleProvider不支持Oracle9i.但是,目前我所使用的还是Oracle9i。为此,对EFOracleProvider修改了以下,以便使其支持Oracle9i. 下面说说具体修改地方.(红色部分为添加或修改的代码部分) 一,修改EFOracleProvider 1,修改EFOracleProviderManifest.cs类文件, internal const string TokenOracle9i = "9i";//add by xray2005 internal const string TokenOracle10g 阅读全文
posted @ 2011-07-02 17:08 quietwalk 阅读(463) 评论(0) 推荐(0) 编辑
摘要:目前,EF对存储过程的支持并不完善。存在以下问题: l EF不支持存储过程返回多表联合查询的结果集。 l EF仅支持返回返回某个表的全部字段,以便转换成对应的实体。无法支持返回部分字段的情况。 l 虽然可以正常导入返回标量值的存储过程,但是却没有为我们自动生成相应的实体.cs代码,我们还是无法在代码中直接调用或使用标量存储过程 l EF不能直接支持存储过程中Output类型的参数。 l 其他一些问题。 本节,我们将学习如何手动添加/修改存储过程,如何使EF能够支持Output类型的参数。 l 添加/修改存储过程 有时候,某个SQL语句比较复杂,但是数据库中又没有定义相应的存储过程。这个时候,我 阅读全文
posted @ 2011-07-02 17:07 quietwalk 阅读(480) 评论(0) 推荐(0) 编辑
摘要:目前,EF对存储过程的支持并不完善。存在以下问题: l EF不支持存储过程返回多表联合查询的结果集。 l EF仅支持返回返回某个表的全部字段,以便转换成对应的实体。无法支持返回部分字段的情况。 l 虽然可以正常导入返回标量值的存储过程,但是却没有为我们自动生成相应的实体.cs代码,我们还是无法在代码中直接调用或使用标量存储过程 l EF不能直接支持存储过程中Output类型的参数。 l 其他一些问题。 下面,主要针对如何使用存储过程,以及存储返回实体、表的部分字段这个几个问题,做具体介绍。 l 导入存储过程及返回实体 在VS可视化设计器中,打开实体模型(emdx文件)。然后,鼠标右键点击“Cu 阅读全文
posted @ 2011-07-02 17:06 quietwalk 阅读(544) 评论(0) 推荐(0) 编辑
摘要:本节,将介绍如何手动构造复杂类型(ComplexType)以及复杂类型的简单操作。 通常,复杂类型是指那些由几个简单的类型组合而成的类型。比如:一张Customer表,其中有FristName和LastName字段,那么对应的Customer实体类将会有FristName和LastName这两个属性。当我们想把FirstName和LastName合成一个名为CustomerName属性时,此时,如果要在EF中实现这个目的,那么我们就需要用到复杂类型。 目前,由于EF不能显示支持复杂类型,所以我们无法在VS里的可视化设计器里面来设计我们需要的复杂类型。所以,我们需要手动修改实体模型,以便使其支持 阅读全文
posted @ 2011-07-02 17:05 quietwalk 阅读(498) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示