NHibernate系列文章二十:NHibernate关系之一对一(附程序下载)
摘要
NHibernate一对一关系虽然不经常碰到,但是在对于数据库结构优化的时候,经常会碰到一对一关系。比如,产品详细信息比较多的时候,可以把产品详细信息放到另一张表里面,Product主表只记录产品主要信息。这样能够显著提高产品的查询效率。
这篇文章的附件:NHibernate Demo下载。
1、建立ProductDetail表

这里将ProductId设置为主键。
Product和ProductDetail之间的关系。

ProductId既是主键又是外键。
创建ProductDetail的SQL语句
USE [NHibernateDemoDB]
GO /****** Object: Table [dbo].[ProductDetail] Script Date: 07/22/2016 23:02:25 ******/
SET ANSI_NULLS ON
GO SET QUOTED_IDENTIFIER ON
GO CREATE TABLE [dbo].[ProductDetail](
[Id] [int] IDENTITY(1,1) NOT NULL,
[ProductId] [int] NOT NULL,
[Description] [nvarchar](1000) NOT NULL,
CONSTRAINT [PK_ProductDetail] PRIMARY KEY CLUSTERED
(
[ProductId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] GO ALTER TABLE [dbo].[ProductDetail] WITH CHECK ADD CONSTRAINT [FK_ProductDetail_Product] FOREIGN KEY([ProductId])
REFERENCES [dbo].[Product] ([Id])
GO ALTER TABLE [dbo].[ProductDetail] CHECK CONSTRAINT [FK_ProductDetail_Product]
GO
2、创建ProductDetail类,修改Product类
ProductDetail类
namespace Demo.XML.Entities.Domain
{
public class ProductDetail
{
public virtual int Id { get; set; }
public virtual string Description { get; set; }
public virtual Product Product { get; set; }
}
}
修改Product类
using System.Collections.Generic; namespace Demo.XML.Entities.Domain
{
public class Product
{
public Product()
{
Orders = new List<Order>();
} public virtual int Id { get; set; } public virtual string ProductCode { get; set; } public virtual string ProductName { get; set; } public virtual string Description { get; set; } public virtual IList<Order> Orders { get; set; } public virtual ProductDetail ProductDetail { get; set; }
public virtual void SetDetailInfo(ProductDetail detail)
{
this.ProductDetail = detail;
detail.Product = this;
}
}
}
Product和ProductDetail双向关联。
3、添加ProductDetail.hbm.xml文件,修改Product.hbm.xml文件
ProductDetail.hbm.xml文件
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Demo.XML.Entities" namespace="Demo.XML.Entities.Domain">
<class name="ProductDetail" table="ProductDetail">
<id name="Id">
<generator class="native" />
</id>
<property name="Description" not-null="true"/>
<many-to-one name="Product" unique="true" column="ProductId"/>
</class>
</hibernate-mapping>
从表ProductDetail到主表Product这里设置成many-to-one关系,unique="true"表示这个这个Product属性是唯一键,column指出对应的数据库列名。
Product.hbm.xml文件
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Demo.XML.Entities" namespace="Demo.XML.Entities.Domain">
<class name="Product" table="Product">
<id name="Id">
<generator class="native" />
</id>
<property name="ProductCode" not-null="true"/>
<property name="ProductName" not-null="true"/>
<property name="Description"/>
<bag name="Orders" table="ProductOrder" cascade="all">
<key column="ProductId"/>
<many-to-many class="Order" column="OrderId"/>
</bag>
<one-to-one name="ProductDetail" cascade="all" />
</class>
</hibernate-mapping>
一对一关联使用one-to-one进行映射。这里配置成从主表Product到从表ProductDetail的级联关系为all,从表到主表没有设置级联关系。
4、关联关系的添加修改和删除
修改Main函数
using Demo.Service;
using Demo.Service.Interface;
using Demo.XML.Entities.Domain;
using System; namespace Demo.ConsoleApp
{
class Program
{
static readonly IProductService productService = new ProductService(); static void Main(string[] args)
{
HibernatingRhinos.Profiler.Appender.NHibernate.NHibernateProfiler.Initialize(); ProductDetail detail = new ProductDetail { Description = "This is a very good product" };
Product product = new Product { ProductCode = "", ProductName = "orange" };
product.SetDetailInfo(detail); int productId = productService.Save(product); product.ProductDetail.Description = "This is an excellent product";
productService.Update(product); productService.Delete(productId); Console.WriteLine("Completed");
Console.ReadLine();
}
}
}
执行该程序,得到监控结果

从监控结果看到NHibernate正确维护了表之间的一对一关系。
NHibernate系列文章二十:NHibernate关系之一对一(附程序下载)的更多相关文章
- NHibernate系列文章二十二:NHibernate查询之HQL查询(附程序下载)
摘要 NHibernate提供了多种查询方式,最早的HQL语言查询.Criteria查询和SQL Query,到NHibernate 3.0的Linq NHibernate,NHIbernate 4. ...
- NHibernate系列文章二十八:NHibernate Mapping之Auto Mapping(附程序下载)
摘要 上一篇文章介绍了Fluent NHibernate基础知识.但是,Fluent NHibernate提供了一种更方便的Mapping方法称为Auto Mapping.只需在代码中定义一些Conv ...
- NHibernate系列文章二十五:NHibernate查询之Query Over查询(附程序下载)
摘要 这一篇文章介绍在NHibernate 3.2里引入的Query Over查询,Query Over查询跟Criteria查询类似.首先创建IQueryOver对象,然后通过调用该对象的API函数 ...
- NHibernate系列文章二十四:NHibernate查询之Linq查询(附程序下载)
摘要 NHibernate从3.0开始支持Linq查询.写Linq to NHibernate查询就跟写.net linq代码一样,非常灵活,可以很容易实现复杂的查询.这篇文章使用Linq to NH ...
- NHibernate系列文章二十六:NHibernate查询之SQL Query查询(附程序下载)
摘要 NHibernate在很早的版本就提供了SQL Query(原生SQL查询),对于很复杂的查询,如果使用其他的查询方式实现比较困难的时候,一般使用SQL Query.使用SQL Query是基于 ...
- NHibernate系列文章二:创建NHibernate工程
摘要 这篇文章介绍了如何创建一个简单的使用NHibernate的控制台应用程序,包括使用NuGet.简单的配置.单表映射.对NHibernate配置文件添加智能提示.使用ISessionFactory ...
- NHibernate系列文章一:NHibernate介绍
摘要 NHibernate是一个成熟的开源的面向对象的.net映射框架.大量的实际项目中正在使用该框架.他是建立在ADO.Net基础之上.目前的版本是NHibernate 4.0.4.本系列文章都是基 ...
- NHibernate系列文章十七:NHibernate Session管理(附程序下载)
摘要 NHibernate的Session的管理涉及到NHibernate的两个最重要的对象ISessionFactory和ISession.ISessionFactory的生成非常消耗资源,通常都在 ...
- NHibernate系列文章八:NHibernate对象一级缓存
摘要 Nhibernatea缓存非常强大,按照缓存存储在Session对象还是SessionFactory对象分为一级缓存和二级缓存. 一级缓存存在于Session对象里,也叫Session缓存,由S ...
随机推荐
- 【java规则引擎】之Drools之Rete算法
一:规则引擎--->规则引擎的核心是Pattern Matcher(模式匹配器).不管是正向推理还是反向推理,首先要解决一个模式匹配的问题.--->对于规则的模式匹配,可以定义为: 一个规 ...
- zabbix问题处理
工作的时候回遇到各种各样的问题. 今天遇到一个关于zabbix的问题. "Zabbix agent on host.name is unreachable for 5 minutes&quo ...
- 查看死锁 的存储过程 ,工具存储过程 sp_who_lock
http://blog.sina.com.cn/s/blog_95b5eb8c010162jp.html if exists (select * from dbo.sysobjects where i ...
- web编程
展示层 html/css/javascript/jquery/jquery easyUI/ajax bootstrap web层 varnish/haproxy/squid----lvs/keepal ...
- 真机测试-Please enter a different string错误解决
错误原因是这个bundle ID已经被占用了,这是想到的是要重置测试证书,那么则需要去修改Bundle identifier,因为测试证书是以Bundle identifier为基准的,修改后运行,重 ...
- ubuntu中常用软件的安装
1.有道词典 1.百度有道词典,进入有道首页,点"下载词典客户端",下载对应版本. 2.打开终端,进入下载目录,输入sudo dpkg -i youdao-dict_1.0.2~u ...
- 智能指针weak_ptr解决循环依赖问题
#include <iostream> #include <memory> class Woman; class Man{ private: std::weak_ptr< ...
- pythonbrew, pythonz, virtualenv
Python 的虛擬環境及多版本開發利器─Virtualenv 與 Pythonbrewhttp://www.openfoundry.org/tw/tech-column/8516-pythons-v ...
- [Maven]Maven安装简述
maven安装简述 1检查jdk安装 1.1cmd输入echo %JAVA_HOME%检查JAVA_HOME是否指向了正确的jdk安装目录 1.2cmd输入java-version检查window是否 ...
- 安装完CentOS 7 后必做的七件事
CentOS是最多人用来运行服务器的 Linux 版本,最新版本是 CentOS 7.当你兴趣勃勃地在一台主机或 VPS 上安装 CentOS 7 后,首要的工作肯定是加强它的安全性,以下列出的七件事 ...