使用NHibernate(7)-- 一对一 && 一对多 && 多对多
1, 一对一。
对于数据量比较大的时候,考虑查询的性能,肯能会把一个对象的属性分到两个表中存放;比如用户和用户资料,经常使用的一般是Id和用户名,用户资料(学校,籍贯等)是不经常被查询的,所以就会分成两个表。实体和映射如下:
使用以下代码插入数据:
public ActionResult InitData()
{
using (var session = MvcApplication.SessionFactory.OpenSession(new DebugInterceptor()))
using (var transaction = session.BeginTransaction())
{
try
{
for (int i = 0; i < 10; i++)
{
User user = new Models.User
{
Name = "FuzhePan_" + i
};
session.Save(user);
UserProfile profile = new UserProfile
{
UserId = user.Id,
Address = "山东山东山东_" + i,
School = "chsoolssss_" + i
};
session.Save(profile);
}
transaction.Commit();
}
catch (Exception)
{
transaction.Rollback();
throw;
}
}
return Content("搞定");
}
以下代码进行数据展示:

结果:

2,一对多 && 多对一。
一对多的关系是最常用的,比如在一个问答系统中,一个用户对应多个问题。
首先添加用户、问题实体和相应映射:
[Class(Table = "NH_User")]
public class User
{
[Id(1, Name = "Id", TypeType = typeof(long), Column = "Id", UnsavedValue = "0")]
[Generator(2, Class = "native")]
public virtual long Id { get; set; }
[PropertyAttribute(Column = "Name", TypeType = typeof(string))]
public virtual string Name { get; set; }
[OneToOne]
public virtual UserProfile UserProfile { get; set; }
[Bag(0, Table = "Question", Lazy = CollectionLazy.True, Cascade ="all")]
[Key(1, Column = "UserId")]
[OneToManyAttribute(2, ClassType = typeof(Question))]
public virtual List<Question> Questions { get; set; }
}
[Class]
public class Question
{
[Id(1, Name = "Id")]
[Generator(2, Class = "native")]
public virtual long Id { get; set; }
[Property]
public virtual long UserId { get; set; }
[Property]
public virtual string Subject { get; set; }
[Property]
public virtual string Body { get; set; }
[ManyToOne(0, Column = "UserId", Insert = false, Update = false)]
public User User { get; set; }
}
User实体添加了一个Question集合,并配置其对应着Question表,Lazy设置延迟加载,通过Key.Column配置逻辑外键是Question中的UserId,通过OneToMany配置用户和问题是一对多的关系。
在Question中,通过ManyToOne配置多队以的关系,Insert=false和Update=false表示当我们插入或修改一个Question的时候并不会级联插入或修改其所对应的User实体。
Bag其实是NHibernate所依赖的Iesi.Collections.dll库中所提供的集合之一,下面对所有集合进行说明:
Bag:对象集合,每个元素可以重复。在.Net中相当于IList或者IList<T>实现。
Set:对象集合,每个元素必须唯一。在.Net中相当于ISet或者ISet<T>实现。
List:整数索引对象集合,每个元素可以重复,在.Net中相当于ArraryList或者List<T>实现。
Map:键值对集合。在.Net中相当于HashTable或者IDictionary<Tkey,TValue>实现。
父级和子级的关系通过inverse配置,级联操作通过Cascade控制。对于一对多的情况,类之间的关系默认是由父级来维护,如果想让自己维护,则需要inverse=true。
Casecade控制级联操作,值有:,none\save-update\delete\all\all-delete-ophan,默认值为none。
none:不进行级联操作,但删除父级时,会将子级的外键置为null。
save-update:保存和修改父级的子级集合时,会同步到数据库中。
delete:删除操作同步到数据库。
all:包括所有,但删除父级时,会将父级关联的外键置为null。
all-delete-ophan:和all的区别是,删除父级时,会级联删除关联的子级。
3,多对多。
多对多的情况,一般通过一个中间表转换成一对多的形式。但NHibernate支持直接配置两个类是多对多,从而忽略中间表的存在。这种情况不常用,故略之。
使用NHibernate(7)-- 一对一 && 一对多 && 多对多的更多相关文章
- JPA级联(一对一 一对多 多对多)注解【实际项目中摘取的】并非自己实际应用
下面把项目中的用户类中有个:一对一 一对多 多对多的注解对应关系列取出来用于学习 说明:项目运行正常 问题类:一对多.一对一.多对多 ============一对多 一方的设置 @One ...
- Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作
Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景: 由于如果只使用一张表存储所有的数据,就会操作数 ...
- mybatis 一对一 一对多 多对多
一对一 一对多 多对多
- day 69-70 一对一 一对多 多对一联表查询
day 69 orm操作之表关系,多对多,多对一 多对一/一对多, 多对多{类中的定义方法} day69 1. 昨日内容回顾 1. 单表增删改查 2. 单表查询API 返回QuerySet对象的: 1 ...
- JPA 一对一 一对多 多对一 多对多配置
1 JPA概述 1.1 JPA是什么 JPA (Java Persistence API) Java持久化API.是一套Sun公司 Java官方制定的ORM 方案,是规范,是标准 ,sun公司自己并没 ...
- MySQL一对一:一对多:多对多: 实例!!!!
学生表和课程表可以多对多 一个学生可以学多门课程 一门课程可以有多个学生: 多对多 *** 一个学生对应一个班级 一个班级对应多个学生: 一对多 *** 一个老师对应多个学生 多个学生对应一个老师:一 ...
- 初学者易上手的SSH-hibernate04 一对一 一对多 多对多
这章我们就来学习下hibernate的关系关联,即一对一(one-to-one),一对多(one-to-many),多对多(many-to-many).这章也将是hibernate的最后一章了,用于初 ...
- SQLAlchemy_定义(一对一/一对多/多对多)关系
目录 Basic Relationship Patterns One To Many One To One Many To Many Basic Relationship Patterns 基本关系模 ...
- MySQL一对一:一对多:多对多
学生表和课程表可以多对多 一个学生可以学多门课程 一门课程可以有多个学生: 多对多 *** 一个学生对应一个班级 一个班级对应多个学生: 一对多 *** 一个老师对应多个学生 多个学生对应一个老师:一 ...
随机推荐
- Myeclipse以及Genymotion工具的使用以及java后台开发小结
1. 服务端的Servlet程序修改并保存后,需要重启tomcat服务器才能使其修改有效.重新部署web项目是没有什么卵用的. 2. servers选项卡若是移走了看不到,在window-show v ...
- 深入理解JS异步编程四(HTML5 Web Worker)
>Web Workers 是 HTML5 提供的一个javascript多线程解决方案,我们可以将一些大计算量的代码交由web Worker运行而不冻结用户界面. 一:如何使用Worker We ...
- 64位Win7下运行ASP+Access网站的方法
64位Win7下运行ASP+Access网站的方法 近日系统升级为WIN7 64位之后,突然发现原本运行正常的ASP+ACCESS网站无法正常连接数据库. 网上搜索多次,终于解决了问题,总结了几条经验 ...
- ORA-01720: grant option does not exist for 'xxx.xxxx' (ORA-01720 ‘XXX’ 不存在授权选项)
原因:用户A将表tab的SELECT权限授予了用户B,而用户B将视图v_tab的查询权限授予C时,也试图将表tab授予用户C,但用户B并没有这个权限(将表tab授予用户C),而引起的 用户B没有授权选 ...
- Python基础(七)内置函数
今天来介绍一下Python解释器包含的一系列的内置函数,下面表格按字母顺序列出了内置函数: 下面就一一介绍一下内置函数的用法: 1.abs() 返回一个数值的绝对值,可以是整数或浮点数等. 1 2 3 ...
- C# 获取地址栏的地址(URL)
原文地址:http://blog.csdn.net/dingxingmei/article/details/8448009 设当前页完整地址是:http://www.jb51.net/aaa/bbb. ...
- 奔小康赚大钱 hdu 2255( KM )
http://acm.split.hdu.edu.cn/showproblem.php?pid=2255 带权匹配问题: #include <stdio.h> #include <a ...
- 新手入门Java需要注意的问题
学习编程,虽然有老师教,但是更重要的事自学.这是很重要的. 现在互联网上面资源太多了,这也就有一个问题:怎么才能在一定时间内学习该知识,掌握该技能呢? 理论联系实践! 学以致用!! 网上的资源太多了, ...
- SDK,monkey 浅谈
最近在工作之余碰到一些手机测试的新手,现在测试手机的基本都是android的系统. 然后在遇到压力测试的时候就开始遇到问题了. 压力测试用什么工具?怎么使用?工具怎么来? 今天遇到两个人都问我SDK是 ...
- FZU 1894 志愿者选拔 (单调队列)
/****************************************************************** 题目: 志愿者选拔(FZU 1894) 算法: 单调队列 算法思 ...