




已阅读5页,还剩25页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
EF,NH,IN 数据层访问框架的比较1. 框架选型背景针对四川日报招标比选网比选系统的全程电子化的实现目标,要求设计出一套高效、稳定的比选系统,这就对数据库访问提升了更高的要求。原系统采用sqlserver数据库,以及的传统数据访问方式。这样在开发效率比较低下,代码健壮性得不到很好的保证。介于此,经开发团队讨论,我们在数据访问层需要采用一个开源的、健壮的、有团队维护的数据层访问框架。在数据访问框架选型时,我们必须包括以下一些标准:1. 框架稳定性2. 框架的运行性能3. 框架维护性4. 框架的开发效率5. 满足系统的多数据库访问要求6. 框架流行度2. 持久化和对象关系映射技术简介2.1 什么是“持久化”和“持久层”持久(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的数据存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等。持久层(Persistence Layer),即专注于实现数据持久化应用领域的某个特定系统的一个逻辑层面,将数据使用者和数据实体相关联。持久层是负责向(或者从)一个或者多个数据存储器中存储(或者获取)数据的一组类和组件。这个层必须包括一个业务领域实体的模型(即使只是一个元数据模型)。不过这里有一个字需要特别强调,也就是所谓的“层”。对于应用系统而言,数据持久功能大多是必不可少的组成部分。那不就是说,我们的系统中,已经天然的具备了“持久层”概念?也许是,但也许实际情况并非如此。之所以要独立出一个“持久层”的概念,而不是“持久模块”,“持久单元”,也就意味着,我们的系统架构中,应该有一个相对独立的逻辑层面,专著于数据持久化逻辑的实现.与系统其他部分相对而言,这个层面应该具有一个较为清晰和严格的逻辑边界。2.2 什么是“对象关系映射”ORM-Object/Relational Mapping,即“对象-关系映射”。对于O/R,即 Object(对象)和 Relational(关系型数据),表示必须同时使用面向对象和关系型数据进行开发。对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。这也同时暗示者额外的执行开销;然而,如果ORM作为一种中间件实现,则会有很多机会做优化,而这些在手写的持久层并不存在。更重要的是用于控制转换的元数据需要提供和管理;但是同样,这些花费要比维护手写的方案要少.对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的,面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。面向对象是从软件工程基本原则(如耦合、聚合、封装)的基础上发展起来的,而关系数据库则是从数学理论发展而来的,两套理论存在显著的区别。为了解决这个不匹配的现象,对象关系映射技术应运而生。让我们从O/R开始。字母O起源于对象(Object),而R则来自于关系(Relational)。几乎所有的程序里面,都存在对象和关系数据库。在业务逻辑层和用户界面层中,我们是面向对象的。当对象信息发生变化的时候,我们需要把对象的信息保存在关系数据库中。当你开发一个应用程序的时候(不使用O/R Mapping),你可能会写不少数据访问层的代码,用来从数据库保存,删除,读取对象信息,等等。你在DAL中写了很多的方法来读取对象数据,改变状态对象等等任务。而这些代码写起来总是重复的。如果打开你最近的程序,看看DAL代码,你肯定会看到很多近似的通用的模式。我们以保存对象的方法为例,你传入一个对象,为SqlCommand对象添加SqlParameter,把所有属性和对象对应,设置SqlCommand的CommandText属性为存储过程,然后运行SqlCommand。对于每个对象都要重复的写这些代码。除此之外,还有更好的办法吗?有,引入一个O/R Mapping。实质上,一个O/R Mapping会为你生成DAL。与其自己写DAL代码,不如用O/R Mapping。你用O/R Mapping保存,删除,读取对象,O/R Mapping负责生成SQL,你只需要关心对象就好。一般的ORM包括以下四部分:l 一个对持久类对象进行CRUD(C:Create/R:Read/U:Update/D:Delete)操作的API;l 一个语言或API用来规定与类和类属性相关的查询;l 一个规定mapping metadata的工具;l 一种技术可以让ORM的实现同事务对象一起进行dirty checking, lazy association fetching以及其他的优化操作。2.3 为什么要做持久化和ORM设计ORM工具应用中的对象到关系数据库中的表的自动的(和透明的)持久化,使用元数据(meta data)描述对象与数据库间的映射。本质上,ORM的工作是将数据从一种表示(双向)转换为另一种。使用ORM进行系统设计开发有如下一些优点:1. 提高生产率(Productivity)你可以集中更多的精力到业务问题上。不论你喜欢哪种应用开发策略自顶向下,从域模型开始;或者自底向上,从一个现有的数据库模式开始使用Hibernate和适当的工具将会减少大量的开发时间。提高了开发效率。由于ORM可以自动对Entity对象与数据库中的Table进行字段与属性的映射,所以我们实际可能已经不需要一个专用的、庞大的数据访问层。2. 可维护性(Maintainability)减少了代码,重构更方便,提高了可维护性。ORM是对象和关系数据库之间的缓冲区,用来很好的将他们隔离。ORM提供了对数据库的映射,大多ORM工具不用sql直接编码,能够像操作对象一样从数据库获取数据。改变数据库结构时我们可不太多地关注sql语句的变化,而是对实体对象关系映射的改变。3. 跨数据库平台(Cross-DB)ORM是数据持久层与数据库实体之间的纽带,大多数ORM工具都具有不同的数据库访问能力,而且不影响持久层的数据访问代码。 4. 厂商独立性(Vendor independence)ORM抽象了你的应用使用下层SQL数据库和SQL方言的方式。使用ORM开发跨平台的应用通常更容易。即使你不需要跨平台操作,ORM依然可以帮你减小被厂商锁定的风险。另外,数据库独立性对这种开发情景也有帮助:开发者使用一个轻量级的本地数据库进行开发但实际产品需要配置在一台不同的数据库上。2.4 ORM的缺点l 无可避免的,自动化意味着映射和关联管理,代价是牺牲性能(早期,这是所有不喜欢ORM人的共同点)。现在的各种ORM框架都在尝试使用各种方法来减轻这块(Lazy Load,Cache),效果还是很显著的。l 面向对象的查询语言(XQL)作为一种数据库与对象之间的过渡,虽然隐藏了数据层面的业务抽象,但并不能完全的屏蔽掉数据库层的设计,并且无疑将增加学习成本.l 对于复杂查询,ORM仍然力不从心。虽然可以实现,但是不值的。我们可以采取视图或者存储过程来实现复杂的查询和操作。2.5 一些比较流行的ORM产品ORM 产品有很多,下面是比较流行的.NET ORM 产品1. A Entity FrameworkEntity Framework 是微软公司为 .NET 开发人员推出的一个 ORM 框架,来实现对数据库单表数据的创建、读取、更新和删除操作,也就是所谓的CRUD。需要说明的是,如果在VS2008中使用Entity Framework就需要安装VS2008SP1。2. IbatisiBATIS一词来源于“internet”和“abatis”的组合,是一个由Clinton Begin在2001年发起的开放源代码项目。最初侧重于密码软件的开发,现在是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO),同时还提供一个利用这个框架开发的JPetStore实例。iBATIS 目前提供了三种语言实现的版本,包括:Java、.NET以及Ruby。3. NHibernateNHibernate 是一个基于.Net 的针对关系型数据库的对象持久化类库。Nhibernate 来源于非常优秀的基于Java的Hibernate 关系型持久化工具。NHibernate 从数据库底层来持久化你的.Net 对象到关系型数据库。NHibernate 为你处理这些,远胜于你不得不写SQL去从数 据库存取对象。你的代码仅仅和对象关联,NHibernat 自动产生SQL语句,并确保对象提交到正确的表和字段中去。4. Active Record是Castle中的一个子项目。它同样是一个非常优秀的持久层框架,在底层封装了NHibernate,改用Attribute来代替配置文件,这样就不用再像NHibernate那样去编写复杂的配置文件。5. DLinqDLinq:.NET Language Integrated Query for Relational Data,DLinq和XLinq(for Xml)共同组成了.net 3.0的关键部分LinQ(Language Integrated Query ),即语言级集成查询能力。DLinq是在分析了ObjectSpaces的反馈之后重新设计的ORM Solutions,作为更先进的查询数据库得到对象并且持久化对象的方式,DLinq将不再使用ObjectSpaces的mapping文件方式,而是使用了attribute 来进行mapping的定义。当然现在也有一些采用attribute 方式的Solutions,如XPO:/Products/NET/XPO/。不过DLinq的第一大特点将是任何ORM方案难以匹敌的,那就是语言级别的查询集成。这是目前ORM阵营(无论是.net、java或者其他)中都难以做到的。3. 各框架应用及资料本章着重介绍现在比较流行三种ORM框架:A Entity Framwork,IB和NHibernate。3.1 A Entity Framework3.1.1 背景及简介A Entity Framework是微软的一个实体框架,此框架可以理解成微软官方的一个ORM产品。ADO.NET 实体框架 设计用于支持开发人员通过对概念性应用程序模型编程(而不是直接对关系存储架构编程)来创建数据访问应用程序。目标是降低面向数据的应用程序所需的代码量并减轻维护工作。Entity Framework 应用程序有以下优点:l 应用程序可以通过更加以应用程序为中心的概念性模型(包括具有继承性、复杂成员和关系的类型)来工作。l 应用程序不再对特定的数据引擎或存储架构具有硬编码依赖性。l 可以在不更改应用程序代码的情况下更改概念性模型与特定于存储的架构之间的映射。l 开发人员可以使用可映射到各种存储架构(可能在不同的数据库管理系统中实现)的一致的应用程序对象模型。l 多个概念性模型可以映射到同一个存储架构。l 语言集成查询支持可为查询提供针对概念性模型的编译时语法验证。ADO.NET Entity Framework作为一个高效的.NET程序语言。其混合了函数语言和物件导向程序编制语言,并且完美的适用于编程、算法、技术和探索性开发,因此可以在使用的过程当中感受到趣味性和吸引力。长久以来,程序设计师和数据库总是保持着一种微妙的关系,在商用应用程序中,数据库一定是不可或缺的元件,这让程序设计师一定要为了连接与访问数据库而去学习 SQL 指令,因此在信息业中有很多人都在研究如何将程序设计模型和数据库集成在一起,对象关系对应 (Object-Relational Mapping) 的技术就是由此而生,像Hibernate或NHibernate都是这个技术下的产物,ADO.NET Entity Framework而微软虽然有了ADO.NET这 个数据访问的利器,但却没有像NHibernate这样的对象对应工具,因此微软在.NET Framework 2.0发展时期。就提出了一个ObjectSpace的概念,ObjectSpace可以让应用程序可以用完全对象化的方法连接与访问数据库,其技术概念 与NHibernate相当类似,然而ObjectSpace工程相当大,在.NET Framework 2.0完成时仍无法全部完成,因此微软将ObjectSpace纳入下一版本的.NET Framework中,并且再加上一个设计的工具(Designer),构成了现在的 ADO.NET Entity Framework。Entity Framework 利用了抽象化数据结构的方式,将每个数据库对象都转换成应用程序对象 (entity),而数据字段都转换为属性 (property),关系则转换为结合属性 (association),让数据库的 E/R 模型完全的转成对象模型,如此让程序设计师能用最熟悉的编程语言来调用访问。而在抽象化的结构之下,则是高度集成与对应结构的概念层、对应层和储存层,以 及支持 Entity Framework 的数据提供者 (provider),让数据访问的工作得以顺利与完整的进行。(1) 概念层:负责向上的对象与属性显露与访问。(2) 对应层:将上方的概念层和底下的储存层的数据结构对应在一起。(3) 储存层:依不同数据库与数据结构,而显露出实体的数据结构体,和 Provider 一起,负责实际对数据库的访问和 SQL 的产生。ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案,早期被称为 ObjectSpace,现已经包含在 Visual Studio 2008 Service Pack 1 以及 .NET Framework 3.5 Service Pack 1 中发表。ADO.NET Entity Framework 以 Entity Data Model (EDM) 为主,将数据逻辑层切分为三块,分别为 Conceptual Schema, Mapping Schema 与 Storage Schema 三层,其上还有 Entity Client,Object Context 以及 LINQ 可以使用。3.1.2 框架体系结构ADO.NET Entity Framework数据建模是将数据模型分为三个部分:概念模型、逻辑模型和物理模型。概念模型定义要建模的系统中的实体和关系。关系数据库的逻辑模型通过外键约束将实体和关系规范化到表中。物理模型通过指定分区和索引等存储详细信息实现特定数据引擎的功能。物理模型由数据库管理员进行优化以改善性能,而编写应用程序代码的程序员的工作主要限制为通过编写 SQL 查询和调用存储过程来处理逻辑模型。概念模型通常用作捕获和传达应用程序的要求的工具,常常以静态关系图的形式供项目早期阶段查看和讨论,随后被弃用。许多开发团队会跳过概念模型的创建,直接从指定关系数据库中的表、列和键开始工作。实体框架 可使开发人员查询概念模型中的实体和关系,同时依赖于 实体框架 将这些操作转换为特定于数据源的命令,从而为概念模型赋予生命。这使应用程序不再对特定数据源具有硬编码的依赖性。概念模型、存储模型以及两个模型之间的映射以外部规范(称为 实体数据模型 (EDM))表示。可以根据需要对存储模型和映射进行更改,而不需要对概念模型、数据类或应用程序代码进行更改。存储模型是特定于提供程序的,因此可以在各种数据源之间使用一致的概念模型。EDM 由以下三种模型和具有相应文件扩展名的映射文件进行定义。l 概念架构定义语言文件 (.csdl) - 定义概念模型。l 存储架构定义语言文件 (.ssdl) - 定义存储模型(又称逻辑模型)。l 映射规范语言文件 (.msl) - 定义存储模型与概念模型之间的映射。实体框架 使用这些基于 XML 的模型和映射文件将对概念模型中的实体和关系的创建、读取、更新和删除操作转换为数据源中的等效操作。EDM 甚至支持将概念模型中的实体映射到数据源中的存储过程。实体框架不仅仅是另一种对象关系映射解决方案,还从根本上使应用程序可以访问和更改表示为概念模型中的实体和关系的数据。对象服务使用 EDM 将对概念模型中所表示的实体类型的对象查询转换为特定于数据源的查询。查询结果具体化为对象服务管理的对象。实体框架 提供以下方式用于查询 EDM 并返回对象:l LINQ to Entities - 提供语言集成查询 (LINQ) 支持用于查询在概念模型中定义的实体类型。l Entity SQL - 与存储无关的 SQL 方言,直接使用概念模型中的实体并支持诸如继承和关系等 EDM 功能。Entity SQL 可用于对象查询和使用 EntityClient 提供程序执行的查询。l 查询生成器方法 - 使您可以使用 LINQ 风格的查询方法构造 Entity SQL 查询。l EntityClient 提供程序通过根据概念性实体和关系访问数据来扩展 ADO.NET 提供程序模型。它执行使用 Entity SQL 的查询。Entity SQL 提供使 EntityClient 能与数据库进行通信的基础查询语言。实体框架 中包含 EntityClient 数据提供程序。此提供程序管理连接,将实体查询转换为特定于数据源的查询,并返回一个由对象服务用来将实体数据具体化为对象的数据读取器。当不需要对象具体化时,通过使应用程序执行 Entity SQL 查询并使用返回的只读数据读取器,还可以像标准 ADO.NET 数据提供程序一样使用 EntityClient 提供程序。下图演示用于访问数据的实体框架体系结构:上图演示各用户可访问编程接口在 实体框架 中的关联方式。向下箭头表示对数据源的查询,向上箭头表示返回的数据。对象服务生成规范命令目录树,该命令目录树表示对概念性模型执行的 LINQ to Entities 或 Entity SQL 操作。EntityClient 提供程序基于 EDM 将此规范命令目录树转换成一个作为对数据源的等效操作的新规范命令目录树。实体框架 生成一个从 ObjectContext 派生的类,该类表示概念模型中的实体容器。此对象上下文提供跟踪更改以及管理标识、并发和关系的功能。此类还公开将插入、更新和删除操作写入数据源的 SaveChanges 方法。与查询类似,这些更改是由系统自动生成的命令或由开发人员指定的存储过程执行的。3.1.3 数据库支持目前已有数个数据库厂商或元件开发商宣布要支持 ADO.NET Entity Framework:(1) Core Lab,支持Oracle、MySQL、PostgreSQL 与 SQLite 数据库。(2) IBM,实现 DB2 使用的 LINQ Provider。(3) MySQL,发展 MySQL Server 所用的 Provider。(4) Npqsql,发展 PostgreSQL 所用的 Provider。(5) OpenLink Software,发展支持多种数据库所用的 Provider。(6) Phoenix Software International,发展支持 SQLite 数据库的 Provider。(7) Sybase,将支持 Anywhere 数据库。(8) VistaDB Software,将支持 VistaDB 数据库。(9) DataDirect Technologies,发展支持多种数据库所用的 Provider。(10) Firebird,支持 Firebird 数据库。3.1.4 使用入门 建立实体数据模型我们使用微软的示例数据Northwind库进行数据建模,开发工具采用vs2010,新建数据层访问工程。注意选择.net framework3.5或是4.0,因为只有3.5sq1版本以上才支持EF。然后在项目中添加A实体数据模型在选择数据库对象时勾选上所有:一路下一步,这样开发工具就为我们生成好了默认的实体数据模型在类图,模型浏览器和映射详细信息中都可以清楚的看到我们的数据库到对象的映射关系 基本增删改 / / 添加 / public void AddCustomer() using (var edm = new NorthwindEntities() Customers customer = new Customers() Address = EFAddress, City = EFCity, CompanyName = EFCompanyName, ContactName = EFContactName, ContactTitle = EFContactTitle, Country = EFCountry, CustomerID = 0+new Random().Next(1,9999), Fax = EFFax, Phone = EFPhone, PostalCode = EFPostCode, Region = EFRegion ; edm.AddToCustomers(customer); /保存,返回受影响条数 int result = edm.SaveChanges(); / / 删除 / / public void DelCustomer(string CustomerID) using (var edm = new NorthwindEntities() Customers customer = edm.Customers.FirstOrDefault(cc = cc.CustomerID.Contains(CustomerID); edm.DeleteObject(customer); int result = edm.SaveChanges(); / / 修改 / / public void UpdateCustomer(string CustomerID) using (var edm = new NorthwindEntities() Customers customer = edm.Customers.FirstOrDefault(cc = cc.CustomerID.Contains(CustomerID); customer.CompanyName += 1; int result = edm.SaveChanges(); 事务操作 / / 事务测试 / / public void TransactionTest(string CustomerID) IList customerlist = new List(); NorthwindEntities edm = null; DbTransaction tran = null; try edm = new NorthwindEntities(); edm.Connection.Open(); tran = edm.Connection.BeginTransaction(); Customers customer = edm.Customers.FirstOrDefault(cc = cc.CustomerID.Contains(CustomerID); customer.CompanyName += 2; int result = edm.SaveChanges(); customer = edm.Customers.FirstOrDefault(cc = cc.CustomerID.Contains(CustomerID); customer.CompanyName += 3; result = edm.SaveChanges(); tran.Commit(); catch (Exception ex) if (tran != null) tran.Rollback(); throw ex; finally if (edm != null & edm.Connection.State != System.Data.ConnectionState.Closed) edm.Connection.Close(); 3.1.5 相关学习资源l /zh-cn/library/bb399572(v=VS.90).aspxl /blusehuang/archive/2007/10/10/920020.htmll /xray2005/archive/2009/05/07/1452033.html3.2 IB3.2.1 背景及简介ibatis是apache的一个开源项目,一个O/R Mapping解决方案。特点是小巧、上手快。官方网站:。iBATIS一词来源于“internet”和“abatis”的组合,是一个由Clinton Begin在2001年发起的开放源代码项目。最初侧重于密码软件的开发,现在是一个基于Java/.NET的持久层框架。iBATIS是一个可以设计和实现更好的 Java/.NET 应用程序持久化层的框架。iBATIS 把对象和存储过程或者使用 XML 描述符的 SQL 语句进行了关联。简单是 iBATIS 最大的优势。Ibatis的数据映射架构使Java和.NET应用程序更容易的使用数据库。Ibatis数据映射一对对象使用存储过程和使用xml描述的SQL语句,这是ibatis相对其他传统映射工具最大的优点。使用Ibatis架构将依赖于你自己的对象,XML,和SQL。没有你不了解的知识。为了能够运用Ibatis,就要要求你十分熟悉Sql和存储过程。3.2.2 框架体系结构iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO),两大部分。SQL Maps是这个框架中最激动人心的部分,它是整个ibatis database layer的核心价值所在。通过使用sql maps你可以显著的节约数据库操作的代码量。sql maps提供一个简单的框架,通过xml描述来映射对象,sql maps使用一个简单的xml文件来实现从对象属性到sql statements的映射。跟其他的框架或者对象映射工具相比,sql maps最大的优势是简单。它需要学习的东西很少,在连接表或复杂查询时也不需要复杂的scheme,使用sql maps, 你可以自由的使用sql语句。 Data Access Objects(DAO)当我们开发灵活的应用时,有一个好主意就是通过一个通用api层把实体操作的细节封装起来。data access objects允许你通过一个简单接口的来操作数据,从而隐藏了实现的细节。使用dao,你可以动态配置你的应用程序来访问不同的实体存储机制。如果你有 一个复杂的应用需要用到几个不同的数据库,dao可以让你建立一个一致的api,让系统的其他部分来调用。3.2.3 使用入门3.3 Nhibernate3.3.1 安装NHibernate如果你从官方网站上下载了完整的NHibernate的zip压缩包,你可以把它解压到你觉得合适的任何目录下。我一般把它解压到c:CodeSharedLibsNHibernate,这不固定,你可能把它解压到其它目录,一般这个目录是用来存放你添加引用的NHibernate和Nunit的dll文件。并添加这些引用到你的demo工程 和测试工程里面。就这样,我的的NHibernate已以安装完成(是不是很简单)。下面我会告诉你怎么样利用用Visual Studio来使用它。首先来看看我们怎么创建一个工程项目。提醒一下,下面的代码都必须运行的Visual Studio 2008和.net Framework 3.5之上。在我们构建我们的应用程序和business objects之前,我们应该先创建一个空白的工程来存放它们。启动Visual Studio并创建一个空白的类库工程。现在我们开始做下一件事情:创建一个business object。3.3.2 定义一个简单的 business object 类.现在开始定义一个非常简单的模型。它包含了一个名叫Product的实体类。这个实体类拥有3个属性:Name,Category和Discontinued。添加一个目录到你的解决方案的第一个工程里面,并添加一个Product.cs类文件到刚才 创建的目录。下面是实体类里面的代码,这个代码非常简单并使用了自动属性(C#3.0以上编译器才支持)namespace FirstSolution.Domainpublic class Productpublic string Name get; set; public string Category get; set; public bool Discontinued get; set; 现在我们根据这个实例去对应数据库。在NHibernate中,上面的一个实体类的一个对象相当于我们数据库中的一个表中的一行数据。所以我们还会去定义一个该实体类和它在数据库存中对应的表的映射。这里我们会使用一个xml映射文件来描述它们之间的映射关系,包括实体属性的映射关系。下面我们会开始创建这个映射文件。3.3.3 创建一个 NHibernate 映射来加载和保存business object.在FirstSample工程中创建一个保存Mappings文件的目录,现添加一个新的xml文档到这个目录并命名为Product.hbm.xml。注意的是文件名“hbm”这部分不可缺少,这是一种规定,NHibernate并以为部分来识别它是否是一个映射文件。我们还将这个xml做为“嵌入的资源”保存在项目文件中。现在我们用资源管理器打开NHibernate的源文件目录并找到名叫“nhibernate-mapping.xsd” 的文件,打这个文件拷贝到你的SharedLibs目录下。这样我们就可以使用这个xml schema 文件来规范我们的映射文件。当我们编辑一个xml映射文档时VS将自动提示或验证。在VS中添加这个schema到Product.hbm.xml文件中现在开始,每一个映射文件都必须使用为根节点。在映射文件中引用的实体类都应该确保使用正确的类的全名(比如FirstSample.Domain.Product,FirstSample)。为是使这个xml内容不太过于冗余,我们可以在要节点下定义assembly和namespace两个属性在根节点,assembly的值程序集的名称,namespace为所在的命名空间。现在我们为这个Product实体定义一个主键,这个主键在Product中是独一无二的,一般来说我们会找一个常知的Key来替代。我们为这个Product实体添加一个Guid类型的属性Id来作为Product的Key,当然你也可以使用int型或long型。using System;namespace FirstSolution.Domainpublic class Productpublic Guid Id get; set; public string Name get; set; public string Category get; set; public bool Discontinued get; set; 下面是已完成相对应的映射文件Nhibernate会根据我们的property名定义了相对应的列名的默认值,如果你的列名的类型不确定,Nhibernate将自动判断列的类型定义。因为我们在这个xml没有添加更多的冗余信息。更多信息你可以查在线文档。3.3.4 配置 NHibernate 连接到你本地的数据库.现在我们来配置NHibernate来连接到我们的数据库,NHibernate支持很多各种不同的数据库。添加一个名为hibernate.cfg.xml的配置文件到FirstSolution项目里面。设置它的“复制到输出目录”为“始终复制”。在这个项目中我们使用的是Sql server数据库,下面为配置信息。NHibernate.Connection.DriverConnectionProviderNHibernate.Dialect.MsSqlCeDialectNHibernate.Driver.SqlServerCeDriverData Source=FirstSample.sdftrue在这个配置文件中我们告诉NHibernate我们是想使用MS Sql Server Compact Edition作为我们的目标数据库,并且数据库名为FirstSample.sdf(相当于连接字符串)。我们还要求可以查看NHibernate在运行时发送到数据库的sql语句(建议在开发时期使用)。3.3.5 自动生成数据库添加一个空的数据库文件名叫FirstSample.sdf到FirstSample工程(在模板中选择本地数据库)。根据向导点击确定或者取消。先来检测我们的配置是否正确,首先在你的ShareLibs目录下应该有以下文件:在你的Microsoft SQL Server Compact Edition目录至少有8个文件可以看到。注
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高中必修一外研社课件
- 高三一轮地球的结构课件
- 计算机网络安全技术(第7版)(微课版) 课件 第三章 计算机病毒
- 离婚协议中房产分割与子女教育基金分配合同
- 生态循环农业种植基地合作投资合同
- 知识产权运营管理服务补充协议正规范本
- 离婚后子女抚养权确定与监护权移交合同
- 网络直播平台股权赠与及内容监管服务协议
- 2024高一物理期中模拟卷01(人教版2019必修一1~3章)(含答案)
- 信息安全技术应用测试卷
- 品牌合作协议书合同范本
- 中小学教育管理干部考核试题及答案
- DL∕T 5767-2018 电网技术改造工程工程量清单计价规范
- 养老院预防老人食品药品误食
- 装配式建筑装饰装修技术 课件 模块二 装配式楼地面
- 地下室转让合同协议书
- 物理化学实验B智慧树知到期末考试答案章节答案2024年北京科技大学
- 基层医疗卫生机构访谈问卷
- (正式版)HGT 6270-2024 防雾涂料
- 美业市场培训课程课件
- 软件测试升职述职报告
评论
0/150
提交评论