创建或修改目录:/www/wwwroot/104.219.215.234/data 失败!
发布日期:2024-11-03 13:05 点击次数:77
下载示例要领代码 - 1肛交 推特,162.6 KB
这篇著述出自于我尝试学习使用Nhiberbnate的挫败感。我发现好像Nhibernate全部的先容材料不是很腌臜等于太详确。我所需要的等于一个浮浅径直的教程,能让我尽快对NHibernate闇练起来。我从来莫得找到。运气的是,这篇著述将会空闲别东谈主的这些需求。
这篇著述有些长,但是我荧惑你以你的方式来阅读。NHibernate是一个复杂的要领,是一个绵延瑕玷的学习过程。这篇著述将为你踏平瑕玷,从几天或是几周诽谤到几个小时。
问题NHibernate方针是处理一个无人不晓的问题,对象握久代码在开荒过程中的瓶颈问题。许多著述标明:1/4到1/3的要领代码是对于对象握久化,从数据库中读取数据,和将数据写回数据库。代码是叠加的,花费手艺的,还有许多琐碎的代码要写。
对于这个问题,有许多处理决策是可用的。代码生成不错在几秒钟生成数据访谒代码。但是如果业务模子转换,这些代码需要从头生成。"对象关系映射"(ORMs)使用了一种新的方式,像NHibernate。他们料理数据访谒愈加透明,提供了许多摧毁的API,不错使用一辆行代码来终了加载和保存总计这个词对象。
先容NHibernate
NHibernate是一个握久化引擎框架。它从数据库中加载业务对象,以及将这些对象的变化更新到数据库中。从著述上头不错看出,它不错只使用一两行代码终了业务对象的加载和保存。
NHibernate使用映射文献来交流从数据库数据到业务对象的调治。还有一种方法,你不错使用类的脾气和属性来替代映射文献。为了让事情尽量浮浅,咱们在这篇著述中将使用映射文献,而不是使用类脾气。另外,映射文献或者很显露的将业务逻辑和握久化代码分开。
好了,咱们只需要在要领中添加几行代码,和为每一个映射文献创建握久化类,而且NHibernate不错顾问到总计的数据库操作。真不知谈使用NHibernate将为咱们简约若干开荒手艺。
记取在.NET环境下,NHibernate并不是唯一的ORM框架。有许多生意的和开源的家具不错提供这样的行状。NHibernate是其中最流行的,主如果因为他遗传自庞大的Hibernate,一个Java环境下相称流行的ORM框架。另外,微软也为ADO.NET提供了"Entity Framework",来提供ORM行状。但是,这个家具还是蔓延,好长手艺还是莫得再开释了。
装置NHibernate
使用NHibernate的第一步等于下载NHibernate和Log4Net(一个开源的日记记载要领,NHibernate使用它来记载空虚和教诲),NHibernate包含了Log4Net最新的版块,你也不错下载总计这个词Log4Net装置包,这里是下载地址:
NHibernate Log4NetNHibernate不是径直需要Log4Net,然则在调试手艺它的自动记载日记功能相称灵验。
目下出手
在这篇著述中,我将使用一个浮浅的示例要领,而不是讲明如何使用NHibernate来进行数据访谒。这是一个限度台利用要领,通过摒除UI代码让要领变的愈加浮浅。这个要领将创建许多个业务对象,来使用NHibernate来对他们进行握久化,然后将他们从数据库中读取出来。
为了要领运行起来,你需要作念一下几个事情:
为陈旭添加NHibernate和Log4Net的要领集援用 为要领添加数据库 修改数据库勾搭字符串这个示例要领援用NHibernate和Log4Net。这些利用应该被你的机器识别,如果你的NHibernate和log4net装置在默许的目次里。如果这些援用不被识别,你不错差别使用NHibernate.dll和Log4Net.dll来替换援用位置。这些DLL文献不错在NHibernate的装置目次中找到。
这个示例要领是按照SQL Server Express 2005来配置的,数据库文献(NhibernateSimpleDemo.mdf和NhibernateSimpleDemo.ldf)还是打包在压缩文献里。你不错将数据库搭在你机器的SQL Server上。
终末,数据库的勾搭字符串配置在App.config文献中,默许你使用的是SQL Server数据库。你不错我方把柄我方机器SQL Server的版块,来修改数据库的勾搭字符串。
业务模子
这里有两种方法使用NHibernate创建利用要领。第一种是“以数据为中心”的方法,它从数据模子和创建业务对象出手。第二种是“以对象为中心”的方法,从业务模子和创建数据库来握久化这个模子出手。这个示例要领使用以对象为中心的方式。
这里示例中的业务模子:
这个模子发扬了一个订单系统的框架,这个模子是不好意思满的,这里只是使用了几个类来讲明使用NHibernate对象握久化。明显这个模子的策画不成代表最好实践,但是用来展示NHibernate是若何责任的还是弥散搪塞了。
此文将使用这个模子来讲明使用NHibernate进行对象握久化的几个意见。
处理浮浅属性 处理Components 处理one-to-many 处理many-to-one 处理many-to-many此文不会触及高档主题,像接管。
这个模子由5个类构成,其中的4个是要握久化的类,非握久化类OraderSystem看成念这个对象模子的宿主。咱们将会在要领运行时启动化OrderSystem对象,然后咱们将加载其他的对象到OrderSystem中来。
OrderSystem.Customers属性领有销售者的客户列表,Customers不错通过CustomerID来访谒,每一个Customer对象领有一个ID,name,和address、一个序列的orders。address将被包成一个单独的Address类中。
Order类包含了一个订单的ID,手艺,主顾信息,和许多购买的家具信息。
Product类包含ID,称号。
请瞩目咱们只留神NHibernate是若何责任的,要领启动化时,Product对象将被实例化放入OrderSystem.Catalog属性中,当一个订单被创建时,Product对象援用将不复制到Order.OrderItems属性中。
NHibernate一个庞大的特质等于不需要为业务类终了绝顶的接口。事实上,业务对象常常不会惦念被握久化机制来加载和保存他们。NHibernate使用的映射数据保存在分离的XML文献中。
数据库
数据库和对象模子并不是完全匹配,对象模子中包含一个Address类,但是数据库中并莫得与之对应的表。数据库中有OrderItems表,但是对象模子中并莫得与之对应的握久化的类。这里的不匹配并不是有益的,咱们念念展示的NHibernate其中的一个意见等于这里并不需要数据库中的表跟类是逐一双应的。
这里是为什么不完全匹配的原因:
Address类并不成代表业务模子的一个实体,相背,它只代表一个实体的值,在这个示例中,代表Customer.Address 属性,咱们将Address分离一个单独的类,这样咱们不错讲明什么叫NHibernate使用“Component mapping”。 OrderItems表是多对多关系中Orders和Products的勾搭表,这样也不成代表对象模子中的一个实体。Customer表包含了一个平庸Customer信息的骨架,包含Customer的Address信息。最好实践不会像咱们这样,将会把Address分离在一个单独的表中。咱们把Address信息保存在Customer表中,这样咱们不错解释什么是NHibernate使用‘Components’类,而不使用Address我方的表,咱们将不才面究诘Components的详确用法。
Orders表只包含一个订单的最浮浅的信息,唯独ID,手艺,和CustomerID。Orders和Customers之间的关系通过一个外键orders.ustomerID 列对应 Customer.ID列。
总计的订单学要一个多对多的关系(每一条订单包含许多条商品信息,每一条商品信息又被包含在许多订单里),是以咱们需要OrderItems表来看成中介,浮浅的勾搭Order编号和Product编号。
这个数据库并不是一个最好实践,它所包含的信息只是用来展示NHibernate是若何责任的。
映射业务模子
许多先容NHibernate的著述齐是以配置文献出手的,但是从另一个场所出手:映射类。映射是NHibernate的中枢,而且配置也给入门者一个很大的绊脚石。当咱们究诘完映射,咱们再讲究先容NHibernate的配置部分。
映射浮浅的指定哪一个表对应哪一个类。咱们把映射的类对应的表叫这个类的“映射表”。
咱们在上头就还是说了,Nhibernate不需要特定的接口或是特定的代码写在要映射的类里。但是它需要被声明成Virtual,这样不错在需要的时候创建代理。NHibernate文档里究诘了为什么这样,目下咱们把总计业务模子中的类声明成Virtual。
映射不错同过分离的XML文献终了,也不错通过在类属性上添加脾气来终了。被用于映射的XML文献不错在职何一个花式里援用。为了浮浅,咱们将展示其中一个方法:通过XML文献映射,映射文献需要被编译成要领集的镶嵌式资源。
你不错映射许多类在归拢个映射文献中,但是常常齐会为每一个类创建一个映射文献。这样不错保握映射文献的短小,而且容易阅读。
出手咱们映射实验之前,先让咱们望望Customer.hbm.xml文献。hbm.xml后缀的文献是NHibernate圭臬的映射文献的后缀。咱们把映射文献放在Model文献下,但是咱们不错把他们放在花式的任何一个场所。最要道的少量是将文献的 BuildAction 属性竖立为 Embedden Resource(镶嵌式资源)。这个竖立将会把映射文献编译到要领集里,这样把他们从要领中脱离出来。
映射文献齐是圭臬的形态:
第一个标签是XML声明,第二个标签界说了XML的定名空间,你不错在这里加入一个XSD信息。第二个标签还包含了属性信息,界说了映射文献要被使用在的要领集称号,这样不错让咱们幸免在映射标签里写总计的类名。
<class>标签
下一个标签用来识别咱们需要映射的类:
<class>标签的属性指定了要映射的类,以及它的映射表:
name属性指定要映射的类名 table属性指定类的映射表 lazy属性见告NHibernate对这个类无谓使用'lazy loading''lazy loading' 见告NHibernate不要从数据库表中加载这个类对象,直到要领中需要访谒这个对象的数据时才加载。这种方式不错减少一个业务对象的内存占用,从而进步性能。处于浮浅,咱们将在这个示例要领中不使用lazy loading。但是在以后使用NHibernate作念花式的时候,一直到早点知谈它的世代相承。
<class>标签中还有许多属性,不错查阅NHibernate的匡助文档。
<id>标签
咱们还是标记了类和类对应的映射表,接下来咱们需要标记类的标记属性和映射表中的标记列。当咱们创建数据的时候,咱们需要标记CustomerID为主键(primary key)。
是以要这些:
指定Customer类的标记属性 指定Customer表记载的标记列 见告NHibernate让SQL Server竖立CustomerID列的值<generator>标签指定数据库记载的标记列的值由SQL Server数据库原生生成。
浮浅属性
咱们竖立好类的标记属性,咱们接下来竖立类的一般属性,Customer类有一个浮浅属性:Name。咱们把它跟数据库Customer表Name列匹配,属性名和列名同样,是以映射文献很浮浅:
咱们不错匹配Name属性到一个不同称号的列上(如CustomerName)。
Component映射
NHibernate使用component来映射那些在数据库中莫得相应的表来映射的类,就像上头提到的Address类,只是作为Customer的一个属性值,数据库中莫得对应的Address表,它除名一个区别常常出目下"实体类"和"值类"。
一个实体类在业务模子中代表着一个实体,在咱们的业务模子中,实体类是Customer、Order、和OrderItem。这些类对应着一个业务对象。 Address类并不代表一个业务对象,它提供了一种封装类值的方式,在NHibernate的术语里,它是一个Customter对象的一个组件。NHibernate用'Component'与.NET使用这个词语无关。一个Component只是一个实体对象的一个值,数据库中莫得与之映射的表。
<component>标签是一个围聚标签。NHibernate将使用.NET反射机制来判断它的真实类型,你也不错通过 class 属性来指定所对应的类名。Customer.hbm.xml文献将匹配两个类。
斡旋映射
面向对象策画缔造在业务模子中的类相互关联的意见上。
One-to-one:一个对象至于另外一个对象关联。像一家一计。 One-to-many:指容器,像一个Customer对象不错包含许多Order对象。 Many-to-one:许多对象不错指向另外归拢个对象,像许多Order对应着一个单独的Customer对象。 Many-to-many:许多对象不错指定另一种对象的任何一个。像一个订单有许多家具,一个家具又不错被包含在许多订单里。围聚映射:One-To-Many
在Customer类里,你会发现存一个Orders属性,暗意客户的总计订单信息。需要瞩方针少量是:Orders 属性并不是List<T>类型,而是IList<T>。
Orders属性被声明为IList<order>,却被实例化为List<Order>。
这是因为NHibernate需要围聚被声明为接口,而不是接口终了。像上头说的,需要被界说成接口,而不是具体的类。这种被认为是很好的编程实践。界说为接口,使NHibernate愈加天真,而且或者进步斥逐。
NHibernate提供了好几种标签来匹配围聚。因为刻下围聚是个IList<T>,目下咱们不错使用<bag>来匹配关联。
name属性不错指定要匹配的类的属性,cascade属性的设定暗意NHibernate将会操作总计的子对象,包括加载、保存以及删除。all-delete-orphan暗意NHibernate将联机保存、删除总计对刻下类对应的子对象。
像:当咱们删除Customer这个对象时,Customer下的属性Orders总计的Order也将会删除。
在总计的关联映命中,cascade必须要指定值,不然NHibernate将不会联机保存或删除。另外<class>标签不错指定一个默许的cascade,使用default-cascade。但是这个值只会提供在保存和更新操作上使用联机操作,不会对删除也使用联机操作。是以,最好照旧竖立cascade这个属性的值。
跟上头一样,为了浮浅,咱们依旧不会使用lazy loading。
<bag>标签里包含了两个标签:
犀利人妻 <key>标签的column属性为方针类指定映射内外的列,这一列被用作刻下类的映射表和方针类的映射表的外键。 <ont-to-many>标签暗意刻下类与以name属性指定的类之间是一双多的关系。name属性指定Order类,刻下类Customer与Order之间是一双多的关系。这里咱们好像健忘了少量东西,咱们指定了方针类,但是莫得指定方针类的映射表。<key>标签指定了映射表的列的称号,而不是映射表的称号。但是NHibernate是若何知谈使用哪个表的呢?这是因为当咱们指定好了方针类的称号之后,NHibernate领悟过方针类的XML映射文献来获取其所应的映射表。是以在这里咱们不需要指定方针类的映射表。
目下,咱们还是完成了Customer类的映射,我出手转向Order类。
围聚映射:Many-To-One
掀开 Order.hbm.xml 文献,目下看的话,内部的内容对你来说还是相称闇练了。<class>标签、<property>标签、还有一个<set>标签是为了一个订单和订单中的商品的一双多关系。但是在Order类和Customer类之间,这里存在着一种新的关系。每一个订单信息需要知谈它是哪个主顾的。
一出手看,这里有点像一双一的关系,一个订单对应一个主顾,但是这样是分歧的,许多条订单不错被包含在一个主顾中,尽管一个订单只对应一个主顾,但是在类的角度上,这是多对一关系。
<many-to-one>标签适于这中关系。此标签内不允许有别的标签,尽管关系是 many-to-one, 'many'个对象同期关联到一个对象上。它其实跟<property>一样浮浅。
这里的属性称号意旨真谛相称径直明了:
name属性指定要映射确刻下类的属性,这个示例中,Customer是Order类的一个属性。 class属性指定方针类。这个示例中,方针类等于Customer。 column属性指定刻下类的映射表与方针类用作外键的列。这个示例中,CustomerID是Order与Customer的使用的外键。 cascade属性指定这种关系的级联类型。class属性不是必需的,NHibernate不错通过.NET反射机制来判断这个类的真实类型;如果映射表中此列于这个类的属性名同样,column属性不错概略。
围聚映射:Many-To-Many
在Order.hbm.xml文献中终末一种兴味的关系等于映射OrderItems属性。OrderItems是IList<Product>类型的,包含了一个序列的Product对象。
这种关系跟One-To-Many关系差未几,因为一个订单信息包含许多商品信息。但是一种商品信息不错被包含在许多订单信息里,是以这里是Many-To-Many关系。
在数据库中,咱们使用 OrderItems 表看成 Orders 表和 Products 表的勾搭表。OrderItems 表中包含Order编号和Product编号。这种方式常常暗意多对多的关系。这种方式是单向的多对多关系,是Order类对Product类。双向的多对多关系口舌常复杂的,在本文中咱们不会触及。
那咱们若何映射多对多关系呢?其实与映射一双多的关系简陋同样,咱们不错使用<bag>标签,它包含一个<many-to-many>标签。
解释一下:
<bag>标签中的name属性用来指明要映射的 Customer 类的属性,这个示例中,等于Orders属性。 <bag>标签中的table属性用来指明勾搭表。这里示例中,等于指 OrderItems 表。 <bag>标签中的cascade属性用来指明这种多对多关系的联机类型。 <bag>标签中的lazy属性用来指明是否使用lazy loading脾气。 <key>标签用来指明勾搭表与刻下类的映射表终了勾搭的外键。这里是指OrderID。 <many-to-many>标签中的class属性用来指明多对多关系中的方针类。这里是指Product类。 <many-to-many>标签中的column属性用来指定勾搭表与方针类的映射表规划的外键。这里虽然是ProductID.这里咱们跟映射one-to-many关系时一样,咱们莫得必要指上海徐汇企业网站策画与制作定方针类的映射表,因为咱们还是指定了方针类,NHibernate领悟过方针类的映射文献来找到它的映射表。
这里的<bag>标签中的cadcade属性竖立为none,这是因为咱们在删掉一个订单信息时,不念念连订单里的家具信息一并删掉。
Order类中目下只剩逐一个浮浅类型,Date,咱们不会再破耗手艺,目下你不错关闭Order类的映射文献。
咱们将不再搜检 Product.hbm.xml 文献,上头的著述还是涵盖了总计 Product 中的关系映射,掀开文献去搜检每一项的映射对读者来说是一个很好的锻练。
调试映射文献
大宽敞映射文献的调试齐是在运行手艺。当一个要领出手配置NHibernate,要领就会尝试去编译总计它能找到的映射文献。如果NHibernate出现问题,将会抛NHibernate.MappingException额外。你不错捕捉这些额外,也不错让它住手实施。另外,这些额外的额外信息不错在 Log4Net 日记文献中找到。最常见的额外信息将会是这样:
调试适宜一般调试模式,处理Bug,从头编译,从头实施。如果你的要领或者完成配置NHibernate,你就应该知谈你的映射文献是莫得问题的。底下咱们来究诘如何配置。
如何NHibernate挟恨其中的一个类莫得映射,尽管你一直为这里类创建了映射文献,那你不错搜检映射文献<class>界说,详情class与映射表匹配是正确的。如果这些齐很正确,请证实映射文献的编译类型是镶嵌式资源。
整合NHibernate
这里莫得正确的方式把NHibernate整合到你的利用要领中,但作家的本意是除名一般的三层架构,把NHibernate的配置和处理代码放在数据层,示例要领中包含一个 Persistence 文献夹,其中包含一个 PersistenceManager 类。
PersistenceManager类包含了握久化业务模子中的每一个实体的一般函数。单单一个类就还是空闲了示例要领,但是对于软件家具这并不是一个很好的实践。在履行的软件编程中,你不错把这些方法分红多个握久化类。
PersistenceManager类配置NHibernate,而且握有一个SessionFactory对象的援用。一个SessionFactory 不错产生多个 Session 对象。Session是NHiberante中一个责任单位。一个Session代表了一次你的要领和NHibernate的一次交互。
你不错把它们看成成交游眉目上一级。一个Session常常唯唯一次交互,但是它不错包含好几个。你一个掀开一个Session,进行一次或是屡次事务,然后关闭它,终末开释它。
Session通过SessionFactory创建。SessionFactory是密集型资源,而且它的启动化本钱较高,从另一方面讲,Session使用了有限的资源,而且强加一些启动化本钱。是以,一般的作念法是在要领启动化时,创建一个全局的SessionFactory。何况在需要使用Session时,才进行创建。
示例要领中,PersistenceManager的启动化只是要领启动化的一部分。PersistenceManager配置了一个SessionFactory。要领使用PersistenceManager.SessionFactory来创建Session。
配置NHibernate
配置NHibernate有两个元素:配置文献和配置代码。
配置文献不错放在要领根目次下的一个单独的文献里,也不错放在App.config文献里。
在著述的出手,咱们冷漠您下载Log4Net,Log4Net领有它本人的配置文献,咱们也把它放在App.config文献中,NHibernate和Log4Net的配置文献需要摈弃在App.config文献中的<configSections>标签中。
NHibernate的配置文献很浮浅,这个配置主如果让NHibernate来创建一个SessionFactory。
Connection provider:提供勾搭的工场。NHibernate应该使用IConnectionProvider。示例要领将使用默许提供的Provider。 Dialect:数据库方言。示例要领将使用SQL Server 2005方言。 Connection driver:数据库勾搭驱动。示例要领将使用SQL Server 客户端驱动。 Connection String:数据库勾搭字符串。示例要领中的数据库勾搭字符串只适相助者的开荒环境。你应该修改成适宜我方的。
配置NHibernate、配置Log4Net
您应该回忆起咱们向示例要领添加了Log4Net的援用。是以配置NHibernate的第一步等于配置Log4Net。Log4Net的配置不是必需的。
目下咱们在App.config文献中添加配置:
接下来为你的类添加下列脾气:
终末一门径用 Configure() 配置Log4Net。
终末在 PersistenceManager 类的构造方法中调用下列方法:
配置NHibernate、配置代码
最初咱们创建一个NHibernate的Configuration对象,通过它来终了从映射文献中映射类。AddAssembly()方法需要总计的映射文献镶嵌到花式的要领聚合,是以总计的映射文献的BuildAction(编译方式)竖立为Embedded Resource(镶嵌式资源)。
接下来咱们需要它来创建一个SessionFactory。咱们不需要指定配置文献是放在App.config中,照旧一个单独的文献中。
BuildSessionFactory()复返一个SessionFactory对象,传递给握久化类的成员变量SessionFactory。
以后要领就不错调用SessionFactory,岂论什么时候念念使用一个Session对象,它是一个全局的变量。
如果咱们使用了许多复杂的类:一个实体类对应一个握久化类,这样的话咱们就需要为每一个类传递一个SessionFactory对象的援用。因为示例要领中,咱们唯唯一个握久化类(PersistenceManager),是以咱们不错把SessionFactory看成成员变量来调用。
使用NHibernate握久化类
NHibernate一个相称庞大的脾气等于终了联级地保存和删除。举例:当咱们保存Customer对象时,NHibernate也会自动将Customer对象下的总计的Order中变化的部分也保存进去。这个功能大大简化了咱们握久化的代码。
PersistenceManager类包含了终浮现基本的增改削查操作的方法。
Save():保存实体。
RetrieveAll():从数据库中遍历给定类型的总计对象。
RetrieveEquals():复返对象中的一个属性等于给定值的总计对象。
Delete():这个方法有两个重载方法,第一个方法删除一个实体,第二个方法删除一个序列的实体。
总计的方法除名以下几个旧例模式:
使用 using 来包装一个NHibernate Session对象,这样不错保证Session在方法实施罢了时自动关闭和自动开释,即使方法实施过程中出现额外。
Save()和Delete()方法齐是用 using 来包装一个 Transaction。同样是为了自动开释和关闭Transaction的资源。
这些方法齐调用Session对象的一般方法。
PersistenceManager类包含一个 Close()方法,而且终了IDisposible接口。这就意味着在要领关闭的时候,必须开释PersistenceManager的总计资源。
PersistenceManager类中的CRUD(创建,遍历,更新,删除)方法不代表一个对象握久化的总计终了。CRUD方法只是用来高傲基本的NHibernate的握久化是若何责任的。NHibernate文档里有详确的解释。
薪金
到了目下你也许会有疑问,NHibernate是一个如斯复杂的配置过程,那他应该和手动写CRUD函数一样浮浅。我个东谈主认为NHibernate的学习过程口舌常贫困的,而且进展很慢。
好了,目下等于他薪金的时候,你是不是认为到目下咱们只不外创建了几个映射文献,还有添加那么几行代码汉典。一朝你了解了这个系统,它确实不是很坏。你取得的亦然联系可不雅的。
念念念念咱们往时通过手写代码获取Customer序列,然后获取每一个Customer的Order对象序列,还有每一个Order的Product对象序列。
望望NHibernate是若何作念的:
底下等于保存的代码:
运行实例要领
示例要领是一个限度台的利用要领,总计它没灵验户进口。但是Program类承担了这个扮装。Main()方法跟Controller类交互。另外Program类注册了OrderSystem.Populate事件,当OrderSystem被从头重载时触发。
上海闵行企业网站策画与制作 这种方式是对MVC架构的一种终了。如果念念对MVC有一个深切的了解,阅读这里。如果你对MVC还不够闇练,通过阅读Main()方法对MVC经由有很好的匡助。
保存一个业务模子
当计帐完数据库,要领在内存中创建业务模子。OrderSystem.Populate()方法出手责任,当其实施罢了后,触发Populated事件,这个事件教唆要领业务模子还是从数据库中从头加载。Program类注册这个事件,用它来打印总计Customer信息和Order信息。
一朝业务模子被创建,要领就会保存。PersistenceManager中的Save<T>()方法展现了使用NHibernate来握久化代码是何等浮浅。咱们以至无谓再沟通数据库。Controller浮浅的论说了PersistenceManager若何来保存对象。
SaveBusinessObjects()方法保存了Products和Customers信息,但是莫得保存Orders信息。因为咱们还是在Customer.Orders属性上把cascading掀开,是以Customer.Orders信息在咱们保存Customer时将会自动保存。
也会宥恕为OrderItems表创建条件,即使咱们莫得为这些写代码。这是因为在Order类的映射文献中,咱们还是指定OrderItems表作为勾搭表在于Order.OrderItems关联的多对多关系中。
删除业务对象
保存了业务模子之后,要领需要将它们从RAM上钩帐。从RAM中删除业务对象并不代码从数据库中删除。如果咱们从RAM删除了业务对象,NHibernate不错从数据库中随时加载出来。
使用NHibernate加载对象
一朝业务模子在RAM中被删除,要领就会从数据库中从头加载出来。这一步咱们将演示若何加载握久阿虎对象。要领使用Controller。LoadBusinessObjects()方法来加载对象,这个方法跟Program类中的方法一样浮浅,也使用 using 来包装。它使用NHibernate中很流行的“Query By Criteria”脾气。
对象的类型通过T参数来制定,这个函数创建一个ICriteria对象,调用List<T>()方法,来复返适宜圭臬的一个对象的围聚。
示例要领加载了两次Order对象,一次是明确的,一次是含蓄的。
当加载OrderSystem.Orders围聚时,明确加载了一次Orders对象
当加载OrderSystem.Customers围聚时含蓄的加载了一次Orders对象。由于Customer映射文献 中的<bag>标签中的cascade属性的竖立,要相识在加载Customer对象的时候自动加载Orders对 象。
话句话说,cascading会作用在加载时,同样也会作用在保存的时候。如果莫得Order围聚,咱们就无谓明确的加载它了。但是加载Orders对象会导致一个风险,等于当咱们念念创建两个无谓援用的Orders对象时,创建两个不同的Orders对象“他们代表着归拢个Orders”。
这里是咱们若何处理这个问题。最初咱们设定Session变量为成员变量,而不是腹地变量。这样不错保证每一个Session变量加载的是归拢种对象。接下来咱们为这个方法添加一个新的参数,SessionAction。这个参数用来指定函数使用哪一个session。
Begin:这个方法复返一个新的Session对象。
Continue:这个方法握续一个还是存在的session对象。
End:这个方法握续一个还是存在的session对象,何况在方法罢了时斥逐它。
BeginAndEnd:这个方法出手一个新的session(会话)并在方法斥逐时斥逐它。
修改后的方法不错加载许多类型不同的对象,因为他们需要在归拢个会话中加载,保证了对象的标记加载了不啻一次。
要领只会在最上头的握久化类上调用RetrieveAll<T>()方法,这些类是:Product,Customer,Orders。咱们莫得必要明确地遍历OrderItems,也莫得必要明确的为Customer加载Orders,或者为Orders加载OrderItems。NHibernate会顾问到总计子对象。
NHibernate在查询数据库上有好几种脾气:
1.Query by criteria:通过创建Criteria对象查询数据库。
2.Query by example:通过创建一个你念念要遍历类型的对象,竖立它的属性来指定某个criteria来查询数据库。
3.Hibernate Query Language:一种跟SQL差未几的查询谈话。
4.SQL语句:也不错通过原生SQL来查询数据库,如果上头几个方法不成空闲你的需求的话。
SQL语句的方式应该是您遴选的终末一种方式,如果上头几种方法不适宜您的话。NHibernate文档有详确的解释。
考证对象标记
一朝示例要领从头加载业务模子以后,它标记对象的标记还是被保存。事实上有两个对象加载了两次:
Order对象在OrderSystem.Orders中明确加载一次,在OrderSystem.Customers[i].Orders中含蓄的加载一次。
另外,Customer对象在OrderSystem.Customers中明确加载一次,在OrderSystem.Orders[i].Customer中含蓄的加载一次。
第一个Customer摈弃了第一个Order。咱们不错测试这个:
1.Customer围聚中的第一个Customer和Order围聚中的第一个Order的Customer是归拢个对象。
2.Order围聚中的第一个Order和Customer围聚中的第一个Customer对象的Order是归拢个对象。
咱们通过使用object.ReferenceEquals()方法来判断两个对象是不是归拢个援用。
从数据库中删除对象
上头咱们还是提到从对象模子中删除一个对象,并不会从数据库删除。示例要领将通过从对象模子中删除一个对象,再从数据库从头加载来解释这少量。
从数据库中删除对象,咱们需要明确的告诉NHibernate。
示例要领展示了从数据库删除第一个Customer对象。然后将会计帐对象模子,在计帐之前,会从头从数据库中加载对象模子。NHibernate在删除Customer记载的同期,同期也删除了Customer的Orders,还有每一个Order下的OrderItems。
把焦点复返到它属于那里
目下咱们还是完成了NHibernate基本的CRUD操作。NHibernate将会大大简化你要领中的握久化代码层,我但愿你不错带着这个不雅点离开。一朝你为你的类创建了映射文献,就不错健忘你的握久层,而且你也无谓破耗几天手艺或是几周来编写一个连累的握久层,才知谈NHibernate这样多平允。
这里还有另外一个平允,也许是最伏击的一个。在VS 2005的花式浏览器中望望这个示例要领,你会发现不部分的责任还是在Model层终浮现,Controller料理业务模子和握久料理器中的责任和代理任务。这样的斥逐等于你不错目田地把你的瞩目勤奋于业务模子上。放松了你写握久化代码的苦差使,NHibernate或者让你的焦点放在你的业务模子上,这是它属于的场所。
英文原版:_Made_Simple.aspx
总结
有些术语翻译的分歧的场所,请全球多多指正,沿途学习NHibernate。
上头先容的加载映射文献,以及配置PersistenceManager、SessionFactory如果搭配Spring.NET,上头的总计配置代码,完全不错通过Spring的依赖注入终了,让代码看起来愈加浮浅。
<上海企业网站策画与制作p> 上头还有提到总计要映射的类的属性需要声明为Virtual,虽然目下也不错无谓声明为virtual。上头提到的一个对象实质上加载两次,在履行的花式中,咱们一般是不会把lazy竖立为true的,因为当一个对象的子对象相称多的时候,NHibernate遍历其子对象是一个相称耗资源的过程。
Spring.NET搭配NHibernate对于.NET完全是一个相称合适的遴选。
Xuem www.cnblogs.com/daydayfree肛交 推特