11 2011 档案

摘要:本篇以及下一篇讨论开发人员在使用NHibernate开发中常见的一些错误。明确请求NHibernate,FluentNHibernate或者ConfORM都定义了许多关于领域模型映射的约定。但是还有很多人定义非常冗长的映射;定义太多,尤其是没有必要的东西,会使重要的映射元素变得模糊,不容易阅读以及难于理解。让我们看看下面完全合法的XML映射片段:<property name="OrderDate" lazy="false" access="Property"type="DateTime" insert=&qu 阅读全文
posted @ 2011-11-30 20:27 BobTian 阅读(3598) 评论(1) 推荐(4) 编辑
摘要:验证复杂的业务规则,只使用特性是不够的。这种情况下,我们需要其他的办法。始终执行有效的实体验证用户输入的数据是否符合实体和值对象要求的一种方式就是拒绝任何违反规则的数据。假设在模型中,实体和值对象总是有效状态,那么我们就可以少写很多错误处理的代码。那么我们如何能实现一个实体或值对象始终处于有效状态呢?让我们看一个简单的例子:我们的程序有一个person实体。person对象的first name和last name必须始终定义。在前面,我们介绍了一个Name值对象,它由三个属性组成:FirstName,MiddleName和LastName。现在我们往这个类中可以添加一些验证逻辑保证一个per 阅读全文
posted @ 2011-11-29 19:47 BobTian 阅读(1926) 评论(4) 推荐(3) 编辑
摘要:表示层简单的验证,我们可以使用基于对象属性内容的验证。在NHibernate Contributions中有一个可用的项目NHibernate.Validator。可以通过SVN下载NHibernate Contribution项目的源代码:地址是https://nhcontrib.svn.sourceforge.net,也可以通过NuGet获得。 配置验证器 一旦在解决方案中引用了NHibe... 阅读全文
posted @ 2011-11-28 21:14 BobTian 阅读(2572) 评论(3) 推荐(2) 编辑
摘要:本篇包括以下几个知识点:Hibernate查询语言(HQL)延迟加载属性批量执行多个查询预先加载和延迟加载比较批量数据修改Hibernate查询语言(HQL)HQL是NHibernate原始的查询语言,它和SQL很像,但是比其他更面向对象。HQL查询定义为字符串,所以不是类型安全的。另一方面,HQL支持动态实体。每个HQL查询都通过调用ISession接口的CreateQuery方法创建,HQL字符串作为参数。查询产品列表,如下面的代码所示:var products = session.CreateQuery("from Product p").List<Produc 阅读全文
posted @ 2011-11-28 10:53 BobTian 阅读(2963) 评论(0) 推荐(7) 编辑
摘要:非类型化的条件查询我们从定义条件查询的根开始,代码如下所示:var query = session.CreateCriteria<Product>();CreateCriteria方法返回一个实现了ICriteria接口的对象。如果获取所有产品的列表,那么我们需要使用接口ICriteria的List<T>方法,如下面的代码所示:var products = session.CreateCriteria<Product>().List<Product>();List<Product>()方法返回IList<Product>。 阅读全文
posted @ 2011-11-27 18:14 BobTian 阅读(7312) 评论(4) 推荐(4) 编辑
摘要:在前面的《NHibernate初学者指南(8):增删查改》一文中简单的提到了查询一个实体的Get<T>和Load<T>方法以及查询实体列表的Query<T>方法,这篇文章我们进一步讲解查询的有关方面。理论知识限制返回的记录数var orders = session.Query<Order>();上面的查询返回Order表中所有的订单,如果想限制返回记录的个数,可以使用Take方法,如下面的代码:var orders = session.Query<Order>().Take(200);筛选记录集使用筛选的关键字是Where。LINQ定 阅读全文
posted @ 2011-11-27 11:15 BobTian 阅读(3247) 评论(5) 推荐(3) 编辑
摘要:XML配置配置NHibernate最初是通过XML。我们有两种方式可以定义配置,一种是Windows应用程序的应用程序配置文件,另一种是基于web的应用程序的Web.config文件。我们也可以在单独的XML文件中定义配置。下面我们通过一个例子,实现一个简单的应用程序,使用NHibernate持久化数据并从关系数据库中读取数据。我们使用的数据库是SQLite。1. 打开Visual Studio,创建一个控制台应用程序:XmlConfigurationSample。2. 在Solution Explorer中,右击XmlConfigurationSample项目,选择属性,在Applicati 阅读全文
posted @ 2011-11-25 10:44 BobTian 阅读(9343) 评论(6) 推荐(4) 编辑
摘要:一旦程序完成,在测试或实际的环境中运行,我们可能想或者需要监测它。有下面几种方法可以监测数据库和应用程序的通信:分析日志文件、使用SQL Server Profiler、使用NHibernate Profiler。下面让我们一一的看看它们吧。 在NHibernate初学者指南(12):日志中我们已经看到了NHibernate可以产生大量的日志数据。这些数据对于分析底层发生的事情非常有用。不管你使... 阅读全文
posted @ 2011-11-23 08:37 BobTian 阅读(2348) 评论(12) 推荐(4) 编辑
摘要:几乎所有的程序都需要日志记录功能。目前为止,已经存在很多提供日志记录功能的框架,我们没必要自己实现,只需要使用它们中的一个即可。.NET中最知名和成熟的日志记录框架是Log4Net。这是一个开源框架,由NHibernate使用。为程序添加日志记录在这个小练习中,我们将创建一个实例程序并配置其使用Log4Net日志记录框架,然后创建一些基本的日志记录信息。1. 打开Visual Studio,创建一个控制台应用程序:LoggingSample。2. 添加对log4net.dll程序集的引用。3. 右击LoggingSample项目,选择属性,在Application选项卡中,设置Target f 阅读全文
posted @ 2011-11-22 20:20 BobTian 阅读(3473) 评论(3) 推荐(1) 编辑
摘要:准备测试环境单元测试通常由三个部分组成:Arrange – 为测试准备或设置边界条件Act – 执行操作Assert — 验证是否是预期的结果我们使用NUnit作为我们的测试框架。首先,我们引入一个基类SpecificationBase,以允许我们用更自然的方式编写我们的单元测试。SpecificationBase的代码如下所示:public abstract class SpecificationBase{ [TestFixtureSetUp] public void TestFixtureSetUp() { BeforeAllTests(); } ... 阅读全文
posted @ 2011-11-22 10:37 BobTian 阅读(1935) 评论(2) 推荐(2) 编辑
摘要:一级缓存为了获得更好的性能,NHibernate智能地缓存数据。NHibernate有不同的缓存机制起作用,最重要的就是一级缓存。每个session对象维持一个一级缓存,session对象创建时缓存创建,session对象释放时缓存销毁。缓存只不过是一个哈希表。哈希表根据唯一键存储值,值可以根据唯一键检索。一个实体由它的ID唯一标识,如果两个实体类型相同,ID也相等,那么这两个实体是相等的。NHibernate要求两个相同类型的对象不能有相同的ID。原因是,如果允许系统有相同ID的两个实例,那么就会将系统置于不一致的状态中。有了这个条件,NHibernate就可以执行下面的操作了:NHiber 阅读全文
posted @ 2011-11-17 22:05 BobTian 阅读(4199) 评论(1) 推荐(5) 编辑
摘要:进行.NET开发,你可能已经接触到下面的一种或几种类型的应用程序:1. 基于Web的应用程序,包括Silverlight。 2. WinForm或WPF应用程序 3. Windows服务。当然,还有很多其他类型的应用程序,但是它们使用NHibernate会话管理的方法和上面三种类型的程序相同。本篇文章,我们创建一个简单的Silverlight应用程序实现基本的会话管理。Silverlight是基于Web的应用程序,所以这里用到的技术也同样适用于其他类型的web程序(ASP.NET MVC或WebForms)。1. 在SSMS中新建一个数据库:SilverlightSample。2. 打开VS, 阅读全文
posted @ 2011-11-17 18:13 BobTian 阅读(2210) 评论(0) 推荐(0) 编辑
摘要:这篇文章介绍Code First开发以及如何与DbContext API一起使用。Code First允许使用C#或VB.NET类定义模型,在类或属性上有选择性的执行额外的配置或者使用Fluent API。模型可用于生成数据库架构或映射现有的数据库。本次演示需要安装Visual Studio 2010。映射现有数据库本次演示将展示Code First生成数据库架构,但同样适用于映射现有数据库,除了... 阅读全文
posted @ 2011-11-17 10:20 BobTian 阅读(5980) 评论(7) 推荐(1) 编辑
摘要:一、创建应用程序为了使问题简单,我们建立一个基本的控制台应用程序,使用DbContext执行数据访问:1. 打开Visual Studio 20102. File -> New -> Project…3. 从左侧菜单中选择"Windows",然后选择"Console Application"4. 输入"ModelFirstSample"作为名字5. 选择"OK"二、创建模型1. 让我们继续,在项目中添加一个Entity Data Model:2. Project –> Add New Item…3 阅读全文
posted @ 2011-11-16 21:55 BobTian 阅读(2948) 评论(6) 推荐(0) 编辑
摘要:在开始之前有必要说一下会话(session)和事务(transaction)。session和transaction是什么session和transaction是NHibernate提供的最重要的两个对象。通过session对象,可以与数据库进行通信以及执行各种操作。transaction对象为我们提供了一个工具,允许以一个单元管理多个操作。SessionNhibernate session可以看成是通往数据库的抽象管道。现在,必须创建一个ADOConnection,打开Connection,传递Connection给Command对象,从Command对象创建DataReader的日子一去不 阅读全文
posted @ 2011-11-16 16:01 BobTian 阅读(6287) 评论(4) 推荐(5) 编辑
摘要:XML映射 在VS中为NHibernate映射文件添加智能感知能力,需要添加.xsd文件。在项目中创建一个解决方案文件夹,名为Schema,添加两个XML schema定义文件:nhibernate-configuration.xsd和nhibernate-mapping.xsd到这个文件夹,如下图: 当为实体定义映射时,我们添加一个新的XML文件到项目中。这个文件的扩展名必须是.hbm.... 阅读全文
posted @ 2011-11-15 16:47 BobTian 阅读(2563) 评论(0) 推荐(1) 编辑
摘要:使用Fluent NHibernate自动映射使用Fluent NHibernate自动映射,首先要将映射的实体放到一个命名空间中,这使得通知AutoMapper哪些实体和值对象包含在映射中更容易。建议在你的项目中创建一个Domain文件夹,将需要映射的实体和值对象放到这个文件夹中。因为隐式映射实体和值对象,需要为AutoMapping定义约定和例外。我们通过实现一个继承自DefaultAutomappingConfiguration的配置类实现。假设我们已经将所有的实体和值对象放在了相同的命名空间中,这个命名空间只包含domain类,我们就可以如下面的代码定义配置类:public class 阅读全文
posted @ 2011-11-14 21:10 BobTian 阅读(3838) 评论(4) 推荐(2) 编辑
摘要:映射类型当使用Nhibernate作为我们的ORM框架时,有四种主要的映射类型:基于XML的映射。基于特性的映射。Fluent映射。基于约定的映射,有时也称为自动映射。在接下来的三篇文章里,将详细讲解除“基于特性映射”以外的映射类型。Fluent映射本篇文章的所有操作需要在NHibernate初学者指南(3):创建Model中创建的代码基础上完成,代码下载地址:点击这里下载。为了能够使用Fluent方式映射我们的模型到底层的数据库,需要添加Fluent NHibernate和NHibernate两个引用,这两个程序集可以在NHibernate初学者指南(2):一个完整的例子中创建的lib文件中 阅读全文
posted @ 2011-11-14 17:36 BobTian 阅读(4621) 评论(3) 推荐(0) 编辑
摘要:本章内容包括 理解并发问题 配置并发 处理并发异常 处理事务 假设你想在网上订机票。查询你的航班,发现还有座位,但是当你单击预订按钮时,系统提示机票已售罄。如果再次查询该航班,发现已经没有座位了。这是怎么回事呢?原来是在你查询到结果和预订之间,其他人预订了最后一张票。系统对最后一张票进行了并发查询,如果没有并发检查,该航班的机票就会超额预订。 本章将深入并发和事务处理。现在我们先来了解什么是并发... 阅读全文
posted @ 2011-11-13 15:43 BobTian 阅读(5176) 评论(3) 推荐(5) 编辑
摘要:一些基本知识本篇文章的目的是创建一个匹配我们模型的数据库,对于其中涉及到的一些数据库的知识就不再赘述。我简单的列一些涉及到的知识吧:如何在SSMS中创建数据库使用可视化和脚本创建数据表数据库中的数据类型关系(一对多,一对一,多对多)约束(非空约束,唯一约束,主键约束,检查约束,外键约束)索引数据库三范式大概就涉及到这些知识吧,任何一本数据库的书上都有对以上知识的详细讲解。下面我们就一步一步完成数据库的设计。实战时间一、创建空数据库1. 打开SSMS,新建一个数据库,名字为:OrderingSystem。二、创建Products表1. 按照下图定义字段,并设置Id为主键。2. 添加Check约束 阅读全文
posted @ 2011-11-13 09:08 BobTian 阅读(2873) 评论(2) 推荐(0) 编辑
摘要:7.4 持久化的一些技巧持久化过程中的很多东西都有可能引起错误,如字符串太长,违反外键约束,不为空的列设置为null,重复键等等。这些都是引发异常的典型原因。让我们看看如何在代码中处理这些异常吧。7.4.1 处理持久化异常一般来说,处理异常很简单,在try/catch块中调用SaveChange即可。由EF引起的异常也是如此,但是要捕捉一个特定的异常:UpdateException。UpdateE... 阅读全文
posted @ 2011-11-12 15:15 BobTian 阅读(2905) 评论(0) 推荐(0) 编辑
摘要:什么是Model我这里简单的用一句话概括什么是model:model是对现实的描述,它可以被开发人员、业务分析师、客户所理解,它不是UML图或者其他任何以开发者为中心描述domain的方式。model的元素实体(Entity)实体是这样一个对象:由它的属性组合唯一标识以及有定义好的生命周期。通常实体包含一个ID或key属性,用于唯一标识它。两个具有相同类型和相同标识符的实体被认为是相同的实体。在Line of Business(LOB)应用程序中典型的实体有:customer,product,order,supplier等等。拿一个电子商务程序作为例子,通过唯一标识符来区分customer是非 阅读全文
posted @ 2011-11-12 11:59 BobTian 阅读(3844) 评论(5) 推荐(5) 编辑
摘要: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 阅读(2496) 评论(3) 推荐(2) 编辑
摘要:准备开发环境操作系统:Windows Vista, Windows 7, Windows Server 2003 或 Windows Server 2008IDE:VS 2010 Professional, VS C# 2010 Express 或 VS Basic 2010 Express如果不使用Visual Studio,可以使用开源的IDE:MonoDevelop,它是是专门为C#和其他.NET语言设计的IDE。可以从这里下载。SharpDevelop,它是.NET平台下C#,VB.NET和Boo项目的免费IDE。,可以从这里下载。数据库:NHibernate支持主流的关系型数据库,像 阅读全文
posted @ 2011-11-09 22:13 BobTian 阅读(10094) 评论(22) 推荐(4) 编辑
摘要:7.2 持久化修改的实体到数据库持久化单个实体到数据库有三种方式:持久化为一个新行。使用属性更新一个存在的行。使用键值属性(key properties)删除一个存在的行。7.2.1 持久化为一个新行 首先,添加客户。非常简单:使用AddObject方法,传递一个Customer实例,然后调用SaveChanges。因为主键属性是identity,所以没有必要设置它的值;如果设置了,值也会被忽略。... 阅读全文
posted @ 2011-11-09 14:47 BobTian 阅读(2597) 评论(7) 推荐(2) 编辑
摘要:这个系列所有的文章都是根据NHibernate 3 Beginner's Guide一书完成的,主要记录自己的学习经历,方便以后的查阅。鉴于《Entity Framework 4 in Action读书笔记》系列文章的经验,这个系列不全部翻译书中内容,那样工作量实在太大了,我尽量本着“精炼”的原则完成这个系列,也希望能给初学的朋友提供一点帮助。下面就开始这个系列吧。什么是NHibernate打开NHibernate Forge的首页,一段英文就会映入我们的眼帘:NHibernate is a mature, open source object-relational mapper fo 阅读全文
posted @ 2011-11-08 15:34 BobTian 阅读(5222) 评论(12) 推荐(6) 编辑
摘要:本章内容包括持久化修改的对象到数据库持久化复杂对象图到数据库带有外键和独立关联的持久化本章,我们讨论如何在连接和断开连接的情况下插入、更新和删除实体。包括单个对象的更新,例如一个customer和复杂关系图的更新,例如一个order和它的details。本章结束的时候,你就可以使用EF处理更新了。让我们开始讨论持久化过程是如何工作的吧。7.1 使用SaveChanges持久化实体实体持久化是存储实... 阅读全文
posted @ 2011-11-08 10:50 BobTian 阅读(3764) 评论(2) 推荐(3) 编辑
摘要:objectstatemanager更改跟踪管理 ObjectStateManager组件(从现在开始称之为 state manager)负责与上下中对象追踪有关的一切: 1.当添加,附加到上下文或者从上下文中删除一个实体,实际上是对state manager做的这些。 2.当我们说上下文保留从数据库中读取的所有实体集合在内存中时,其实是state manager保存这些数据。 3.当上下文执... 阅读全文
posted @ 2011-11-07 22:02 BobTian 阅读(5968) 评论(0) 推荐(4) 编辑
摘要:管理实体状态 上下文仅仅自动处理Unchanged状态到Modified状态的转变。其他的状态转变必须使用适当的方法显示处理: AddObject——在Added状态时给上下文添加一个实体。 Attach——在Unchanged状态时附加一个实体到上下文。 ApplyCurrentValues和ApplyOriginalValues——改变状态为Modified,将追踪的实体与另一个比较。 D... 阅读全文
posted @ 2011-11-07 08:37 BobTian 阅读(4481) 评论(6) 推荐(2) 编辑
摘要:接下来我们需要实现的是简历的修改。第一,在ResumeController中添加两个Action,如下面的代码:第二,创建Edit.cshtml,跟创建Create.cshtml一样,选择Empty。第三,在Index.cshtml中添加如下代码:第四,运行效果:简历的详细信息第一,添加Action。第二,创建Details.cshtml,同上。第三,运行效果:简历的删除第一,添加Action。创... 阅读全文
posted @ 2011-11-04 13:35 BobTian 阅读(3014) 评论(13) 推荐(4) 编辑
摘要:这两天忙着准备考试,背书背的一个烦字了得,于是做了一个Demo来解解烦。这个Demo是关于简历的,并没有什么技术含量,只是一直想拿Colorbox做个例子发上来。还是先来分析一下功能,主要是实现简历的CRUD,其次是利用Colorbox弹出对话框来代替跳转到一个新的页面执行操作。这个Demo我打算一步一步的完成操作,希望给初学者提供一点点的帮助。搭建程序的框架打开VS2010,选择File➤Project➤Asp.net MVC 3 Web Application,设置项目的名称为Resume。如下图所示:点击“OK”,在弹出的“New ASP.NET MVC 3 Project”对话框中,选 阅读全文
posted @ 2011-11-04 10:21 BobTian 阅读(6500) 评论(44) 推荐(7) 编辑

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