NHibernate one-to-one
主键关联:
两个表拥有相同的主键字段,值相同的关联在一起。典型的应用是一个对象的属性太多,将常用的属性跟不常用的附加属性分开存放,或者按照业务分类存放、维
护,例如物料的通用属性、财务属性、采购属性、生产制造属性。因为表示的是同一个对象,所以它们的生命周期是相同的。但一般会有一个主从关系,因为通常我
们会将其中的一个主表跟对象直接映射,其它的做为附属。
唯一外健关联:
两个表拥有独立的主键字段(实体id),一个表用外键关联另外一个表。其实就是将一个one-to-many的表结构设计当作one-to-one的方式使用。
拥有独立的实体id,通常意味着对象的生命周期是独立的,需要的时候可以建立起one-to-one的关系,分开之后仍独立存在。例如夫妻关系(假设一夫一妻制),士兵跟枪的关系(假设一个士兵只配备一支枪)。
主键关联示例:
<id name="BoxId" >
<column name="BOX_ID" sql-type="NUMBER(8,0)" not-null="true"/>
<generator class="assigned" />
</id>
<one-to-one name="WrapperParam" lazy="proxy" cascade="all" />
</class>
{
private int _boxId;
private WrapperParamDao _wrapperParam;
public BoxDao()
    {
    }
public virtual int BoxId
    {
        get { return this._boxId; }
        set { this._boxId = value; }
    }
public virtual WrapperParamDao WrapperParam
    {
        get { return this._wrapperParam; }
        set { this._wrapperParam = value; }
    }
}
<id name="BoxId" >
<column name="BOX_ID" sql-type="NUMBER(8,0)" not-null="true"/>
<generator class="foreign">
<param name="property">Box</param>
</generator>
</id>
<one-to-one name="Box" constrained="true" cascade="none" />
</class>
{
private int _boxId;
private BoxDao _box;
public WrapperParamDao()
    {
    }
public virtual int BoxId
    {
        get { return this._boxId; }
        set { this._boxId = value; }
    }
public virtual BoxDao Box
    {
        get { return this._box; }
        set { this._box = value; }
    }
}
WrapperParamDao的配置中,<generator
class="foreign">指示NHibernate在保存的时候,通过Box属性获取BoxId的值。
constrained="true"相当于指定了one-to-one的关联方向,它会影响到Save()、Delete()操作的顺序。
保存WrapperParamDao时需要确保Box属性的有效性,否则将无法获取BoxId值;同样保存BoxDao是要确保WrapperParam的属性值。如果是同时新增这两个对象,更需要注意:
wrapperParam.Box = box;
session.Save(box);
如果<generator class="foreign">配置不当,或者保存时属性没有设置,将会报错"Unexpected row count: 0; expected: 1"之类:
Unexpected row count: 0; expected: 1
at NHibernate.AdoNet.Expectations.BasicExpectation.VerifyOutcomeNonBatched(Int32 rowCount, IDbCommand statement)
at NHibernate.Impl.NonBatchingBatcher.AddToBatch(IExpectation expectation)
at NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id,
 Object[] fields, Object[] oldFields, Boolean[] includeProperty, Int32
j, Object oldVersion, Object obj, SqlCommandInfo sql,
ISessionImplementor session)
at NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id,
 Object[] fields, Int32[] dirtyFields, Boolean hasDirtyCollection,
Object[] oldFields, Object oldVersion, Object obj, ISessionImplementor
session)
at NHibernate.Impl.ScheduledUpdate.Execute()
at NHibernate.Impl.SessionImpl.Execute(IExecutable executable)
at NHibernate.Impl.SessionImpl.ExecuteAll(IList list)
at NHibernate.Impl.SessionImpl.Execute()
at NHibernate.Impl.SessionImpl.Flush()
at NHibernate.Transaction.AdoTransaction.Commit()
唯一外健关联:
NHibernate文档中的例子:
NHibernate one-to-one的更多相关文章
- Nhibernate的Session管理
		
参考:http://www.cnblogs.com/renrenqq/archive/2006/08/04/467688.html 但这个方法还不能解决Session缓存问题,由于创建Session需 ...
 - "NHibernate.Exceptions.GenericADOException: could not load an entity" 解决方案
		
今天,测试一个项目的时候,抛出了这个莫名其妙的异常,然后就开始了一天的调试之旅... 花了很长时间,没有从代码找出任何问题... 那么到底哪里出问题呢? 根据下面那段长长的错误日志: -- ::, ...
 - nhibernate连接11g数据库
		
我框架的数据映射用 nhibernate连接多数据库,这次又增加了oracle11g,负责开发的同事始终连接不上,悲催的sharepoint调试是在不方便... 下面描述下问题的解决,细节问题有3个: ...
 - 全自动迁移数据库的实现 (Fluent NHibernate, Entity Framework Core)
		
在开发涉及到数据库的程序时,常会遇到一开始设计的结构不能满足需求需要再添加新字段或新表的情况,这时就需要进行数据库迁移. 实现数据库迁移有很多种办法,从手动管理各个版本的ddl脚本,到实现自己的mig ...
 - 跟我学习NHibernate (1)
		
引言:Nibernate概述 NHibernate是一个ORM框架,NHibernate是一个把C#对象世界和关系世界数据库之间联系起来的一座桥梁.NHibernate 能自动映射实体模型到数据库,所 ...
 - 让OData和NHibernate结合进行动态查询
		
OData是一个非常灵活的RESTful API,如果要做出强大的查询API,那么OData就强烈推荐了.http://www.odata.org/ OData的特点就是可以根据传入参数动态生成Ent ...
 - MVC Nhibernate 示例
		
首先,非常感谢提出问题的朋友们,使得本人又去深入研究了NHibernate的<Session-Per-Request 模式>. 前言: 谈到NHibernate大伙并不陌生,搞Java ...
 - Nhibernate mapping 文件编写
		
生成工具软件 现在生成工具软件有很多了,例如商业软件:NMG.CodeSmith.Visual NHibernate,开源软件:MyGeneration.NHibernate Modeller.AjG ...
 - NHibernate之映射文件配置说明
		
NHibernate之映射文件配置说明 1. hibernate-mapping 这个元素包括以下可选的属性.schema属性,指明了这个映射所引用的表所在的schema名称.假若指定了这个属性, 表 ...
 - NHibernate常见问题及解决方法
		
NHibernate常见问题及解决方法 曾经学过NHibernate的,但是自从工作到现在快一年了却从未用到过,近来要巩固一下却发现忘记了许多,一个"in expected: <end ...
 
随机推荐
- VS2013 当前不会命中断点,还没有为该文档加载任何符号
			
方法一: 把ie的 调试 打开,然后调试的时候 会问你 是在新示例中打开 还是 当前示例,你选择当前的就行了.还有 建议你用 ie8.0的 开发者工具 调试 非常舒服 我已经 早就不用debuger ...
 - Solr入门之(6)配置文件solrconfig.xml
			
solrconfig.xml包含了用于配置自身行为的绝大部分参数,其作用范围是当前core.该文件位于${solr_home}/solr/core1/conf/下. 参数列表概览: A.lib B.d ...
 - linux环境下libevent的使用
			
step1:安装libevent yum install libevent step2: 代码入下: #include <sys/socket.h> #include <sys/ty ...
 - 吐个槽,对VB6.0 还有VBS 说ByeBye
			
往事不堪回首,折腾了个把月的老系统,心中郁结,不吐不快.系统架构是ASP +VBS +VB6.0 + SQL Server2000, 第一个版本开发完成大概是在2000年.基本是处于交接无力,看代码就 ...
 - python解析RSS(feedparser)
			
虽然说当今的博客已经不像前几年那么火了,但是RSS还是一项很有创造性和实用性的东西.RSS 是用于分发 Web 站点上的内容的摘要的一种简单的 XML 格式.它能够用于共享各种各样的信息.关于RSS的 ...
 - ASP.NET 5中的ASP.NET Bundles跑到哪里去了?
			
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 众所周知,在ASP.NET MVC中很早就存在一个所谓的"bundling and ...
 - Android UI学习 - Tab的学习和使用(转)
			
本文是参考Android官方提供的sample里面的ApiDemos的学习总结. TabActivity 首先Android里面有个名为TabActivity来给我们方便使用.其中有以下可 ...
 - POJ 1625 Censored!(AC自动机+DP+高精度)
			
Censored! Time Limit: 5000MS Memory Limit: 10000K Total Submissions: 6956 Accepted: 1887 Descrip ...
 - barabasilab-networkScience学习笔记6-evolving networks
			
第一次接触复杂性科学是在一本叫think complexity的书上,Allen博士很好的讲述了数据结构与复杂性科学,barabasi是一个知名的复杂性网络科学家,barabasilab则是他所主导的 ...
 - springMVC核心配置文件样例
			
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...