摘要

NHibernate一对一关系虽然不经常碰到,但是在对于数据库结构优化的时候,经常会碰到一对一关系。比如,产品详细信息比较多的时候,可以把产品详细信息放到另一张表里面,Product主表只记录产品主要信息。这样能够显著提高产品的查询效率。

这篇文章的附件:NHibernate Demo下载。

1、建立ProductDetail表

这里将ProductId设置为主键。

Product和ProductDetail之间的关系。

ProductId既是主键又是外键。

创建ProductDetail的SQL语句

  1. USE [NHibernateDemoDB]
  2. GO
  3.  
  4. /****** Object: Table [dbo].[ProductDetail] Script Date: 07/22/2016 23:02:25 ******/
  5. SET ANSI_NULLS ON
  6. GO
  7.  
  8. SET QUOTED_IDENTIFIER ON
  9. GO
  10.  
  11. CREATE TABLE [dbo].[ProductDetail](
  12. [Id] [int] IDENTITY(1,1) NOT NULL,
  13. [ProductId] [int] NOT NULL,
  14. [Description] [nvarchar](1000) NOT NULL,
  15. CONSTRAINT [PK_ProductDetail] PRIMARY KEY CLUSTERED
  16. (
  17. [ProductId] ASC
  18. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
  19. ) ON [PRIMARY]
  20.  
  21. GO
  22.  
  23. ALTER TABLE [dbo].[ProductDetail] WITH CHECK ADD CONSTRAINT [FK_ProductDetail_Product] FOREIGN KEY([ProductId])
  24. REFERENCES [dbo].[Product] ([Id])
  25. GO
  26.  
  27. ALTER TABLE [dbo].[ProductDetail] CHECK CONSTRAINT [FK_ProductDetail_Product]
  28. GO

2、创建ProductDetail类,修改Product类

ProductDetail类

  1. namespace Demo.XML.Entities.Domain
  2. {
  3. public class ProductDetail
  4. {
  5. public virtual int Id { get; set; }
  6. public virtual string Description { get; set; }
  7. public virtual Product Product { get; set; }
  8. }
  9. }

修改Product类

  1. using System.Collections.Generic;
  2.  
  3. namespace Demo.XML.Entities.Domain
  4. {
  5. public class Product
  6. {
  7. public Product()
  8. {
  9. Orders = new List<Order>();
  10. }
  11.  
  12. public virtual int Id { get; set; }
  13.  
  14. public virtual string ProductCode { get; set; }
  15.  
  16. public virtual string ProductName { get; set; }
  17.  
  18. public virtual string Description { get; set; }
  19.  
  20. public virtual IList<Order> Orders { get; set; }
  21.  
  22. public virtual ProductDetail ProductDetail { get; set; }

  23. public virtual void SetDetailInfo(ProductDetail detail)
  24. {
  25. this.ProductDetail = detail;
  26. detail.Product = this;
  27. }
  28. }
  29. }

Product和ProductDetail双向关联。

 3、添加ProductDetail.hbm.xml文件,修改Product.hbm.xml文件

ProductDetail.hbm.xml文件

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Demo.XML.Entities" namespace="Demo.XML.Entities.Domain">
  3. <class name="ProductDetail" table="ProductDetail">
  4. <id name="Id">
  5. <generator class="native" />
  6. </id>
  7. <property name="Description" not-null="true"/>
  8. <many-to-one name="Product" unique="true" column="ProductId"/>
  9. </class>
  10. </hibernate-mapping>

从表ProductDetail到主表Product这里设置成many-to-one关系,unique="true"表示这个这个Product属性是唯一键,column指出对应的数据库列名。

Product.hbm.xml文件

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Demo.XML.Entities" namespace="Demo.XML.Entities.Domain">
  3. <class name="Product" table="Product">
  4. <id name="Id">
  5. <generator class="native" />
  6. </id>
  7. <property name="ProductCode" not-null="true"/>
  8. <property name="ProductName" not-null="true"/>
  9. <property name="Description"/>
  10. <bag name="Orders" table="ProductOrder" cascade="all">
  11. <key column="ProductId"/>
  12. <many-to-many class="Order" column="OrderId"/>
  13. </bag>
  14. <one-to-one name="ProductDetail" cascade="all" />
  15. </class>
  16. </hibernate-mapping>

一对一关联使用one-to-one进行映射。这里配置成从主表Product到从表ProductDetail的级联关系为all,从表到主表没有设置级联关系。

4、关联关系的添加修改和删除

修改Main函数

  1. using Demo.Service;
  2. using Demo.Service.Interface;
  3. using Demo.XML.Entities.Domain;
  4. using System;
  5.  
  6. namespace Demo.ConsoleApp
  7. {
  8. class Program
  9. {
  10. static readonly IProductService productService = new ProductService();
  11.  
  12. static void Main(string[] args)
  13. {
  14. HibernatingRhinos.Profiler.Appender.NHibernate.NHibernateProfiler.Initialize();
  15.  
  16. ProductDetail detail = new ProductDetail { Description = "This is a very good product" };
  17. Product product = new Product { ProductCode = "", ProductName = "orange" };
  18. product.SetDetailInfo(detail);
  19.  
  20. int productId = productService.Save(product);
  21.  
  22. product.ProductDetail.Description = "This is an excellent product";
  23. productService.Update(product);
  24.  
  25. productService.Delete(productId);
  26.  
  27. Console.WriteLine("Completed");
  28. Console.ReadLine();
  29. }
  30. }
  31. }

执行该程序,得到监控结果

从监控结果看到NHibernate正确维护了表之间的一对一关系。

NHibernate系列文章二十:NHibernate关系之一对一(附程序下载)的更多相关文章

  1. NHibernate系列文章二十二:NHibernate查询之HQL查询(附程序下载)

    摘要 NHibernate提供了多种查询方式,最早的HQL语言查询.Criteria查询和SQL Query,到NHibernate 3.0的Linq NHibernate,NHIbernate 4. ...

  2. NHibernate系列文章二十八:NHibernate Mapping之Auto Mapping(附程序下载)

    摘要 上一篇文章介绍了Fluent NHibernate基础知识.但是,Fluent NHibernate提供了一种更方便的Mapping方法称为Auto Mapping.只需在代码中定义一些Conv ...

  3. NHibernate系列文章二十五:NHibernate查询之Query Over查询(附程序下载)

    摘要 这一篇文章介绍在NHibernate 3.2里引入的Query Over查询,Query Over查询跟Criteria查询类似.首先创建IQueryOver对象,然后通过调用该对象的API函数 ...

  4. NHibernate系列文章二十四:NHibernate查询之Linq查询(附程序下载)

    摘要 NHibernate从3.0开始支持Linq查询.写Linq to NHibernate查询就跟写.net linq代码一样,非常灵活,可以很容易实现复杂的查询.这篇文章使用Linq to NH ...

  5. NHibernate系列文章二十六:NHibernate查询之SQL Query查询(附程序下载)

    摘要 NHibernate在很早的版本就提供了SQL Query(原生SQL查询),对于很复杂的查询,如果使用其他的查询方式实现比较困难的时候,一般使用SQL Query.使用SQL Query是基于 ...

  6. NHibernate系列文章二:创建NHibernate工程

    摘要 这篇文章介绍了如何创建一个简单的使用NHibernate的控制台应用程序,包括使用NuGet.简单的配置.单表映射.对NHibernate配置文件添加智能提示.使用ISessionFactory ...

  7. NHibernate系列文章一:NHibernate介绍

    摘要 NHibernate是一个成熟的开源的面向对象的.net映射框架.大量的实际项目中正在使用该框架.他是建立在ADO.Net基础之上.目前的版本是NHibernate 4.0.4.本系列文章都是基 ...

  8. NHibernate系列文章十七:NHibernate Session管理(附程序下载)

    摘要 NHibernate的Session的管理涉及到NHibernate的两个最重要的对象ISessionFactory和ISession.ISessionFactory的生成非常消耗资源,通常都在 ...

  9. NHibernate系列文章八:NHibernate对象一级缓存

    摘要 Nhibernatea缓存非常强大,按照缓存存储在Session对象还是SessionFactory对象分为一级缓存和二级缓存. 一级缓存存在于Session对象里,也叫Session缓存,由S ...

随机推荐

  1. 00 alv抬头等

    *&---------------------------------------------------------------------* *& Report ZHJ_TEST0 ...

  2. VS调试技巧,提高调试效率(转):

    如果你还没有使用过这些技巧,希望这篇博文能帮你发现它们. 它们学起来很容易,能帮你节省很多时间. 运行到光标(Ctrl+ F10) 我经常看见人们是这样来调试应用程序的: 他们在应用程序需要调试的代码 ...

  3. CSS3 pointer-events属性

    在某个项目中,很多元素需要定位在一个地图层上面,这里就要用到很多绝对定位或者相对定位的元素,但是这样的话,这些浮在上面的div或者其它元素一般都会给个宽高,或者relative的元素可以不给宽高,这个 ...

  4. sqlite里执行查询提示未启用约束、主键冲突之——数据竟能超字段长度存储

    数据表设计如图:szflbm为主键 数据表主键数据: 以上数据在查询时,执行到该语句adapter.Fill(table); 提示主键冲突. 解决: 1.尝试修改数据,把ZC1改成ZZ,正常.说明原因 ...

  5. SQL JOIN的用法

    背景:(血的教训) 非常感谢能够有幸的去活力世纪面试,面试官非常的祥和,虽然最后没能够去成,但是非常的感谢,是他让我明白了自己还有很多需要去学习,每一次的面试不是为了去证明自己有多强,能拿多少的工资, ...

  6. [原]CentOS 6.5 上安装 MySQL 5.6

    参考文档: http://dev.mysql.com/doc/refman/5.6/en/linux-installation-yum-repo.html 1. 下载 rpm 文件:wget http ...

  7. ubuntu16041,安装opencv3.1.0

    [非常感谢:http://www.linuxdiyf.com/linux/18482.html] 1.依赖关系: sudo apt-get install build-essentialsudo ap ...

  8. jquery遍历数组与筛选数组的方法

    grepgrep()方法用于数组元素过滤筛选 grep(array,callback,invert)array:待过滤数组;callback:处理数组中的每个元素,并过滤元素,该函数中包含两个参数,第 ...

  9. Android开发之百度地图--环境搭建

    这篇文章总结自极客学院张浩老师的android教学课程,在此对张浩老师和崔爽老师表示非常感谢. (一)基础知识 在申请百度地图开发密钥的时候需要用到数字签名证书的内容,所以这里先对此做一下介绍. (1 ...

  10. [C#对sql操作]C#对sql server 2008数据库操作

    using System.Data; using System.Data.SqlClient SqlConnection conn = new SqlConnection(System.Configu ...