随笔分类 -  NHibernate初学者指南

摘要:前面的话 经过三个多周的时间,终于将这个系列完成了,谢谢大家的关注和支持,有很多不足之处还望大家包涵。 本系列参考的书籍为NHibernate 3 Beginner's Guide一书。 该书的随书源代码下载地址为:http://d.1tpan.com/tp1240962233 文章导航 第一章:N 阅读全文
posted @ 2011-12-02 09:05 BobTian 阅读(5385) 评论(12) 推荐(11) 编辑
摘要:使用一个模型读写操作在NHibernate初学者指南(3):创建Model 中我们已经介绍了一个域模型的概念。在后面文章的例子中也都使用了这个域读写以及更新数据。只要该域的复杂性有限或者我们构建的解决方案纯粹是一个forms-over-data类型的应用,这都是有意义的。另一方面,如果我们的域非常复杂,那么这种方法就会快速达到它的极限。CQRSCQRS模式在处理和解决单个和复杂域问题时非常成功。当使用CQRS模型时,域模型专门用于写操作。所有的读操作(这里称为查询)绕过域模型直接到达数据库。因为域模型从查询数据的负担中解放出来,它要简单的多。领域实体很少有耦合关系。整个域可以被分隔为关联实体的 阅读全文
posted @ 2011-12-01 20:16 BobTian 阅读(1904) 评论(0) 推荐(2) 编辑
摘要:本篇以及下一篇讨论开发人员在使用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 阅读(7313) 评论(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) 编辑
摘要:在开始之前有必要说一下会话(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) 编辑
摘要:一些基本知识本篇文章的目的是创建一个匹配我们模型的数据库,对于其中涉及到的一些数据库的知识就不再赘述。我简单的列一些涉及到的知识吧:如何在SSMS中创建数据库使用可视化和脚本创建数据表数据库中的数据类型关系(一对多,一对一,多对多)约束(非空约束,唯一约束,主键约束,检查约束,外键约束)索引数据库三范式大概就涉及到这些知识吧,任何一本数据库的书上都有对以上知识的详细讲解。下面我们就一步一步完成数据库的设计。实战时间一、创建空数据库1. 打开SSMS,新建一个数据库,名字为:OrderingSystem。二、创建Products表1. 按照下图定义字段,并设置Id为主键。2. 添加Check约束 阅读全文
posted @ 2011-11-13 09:08 BobTian 阅读(2873) 评论(2) 推荐(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) 编辑

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