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)-- 一对一 && 一对多 && 多对多的更多相关文章

  1. JPA级联(一对一 一对多 多对多)注解【实际项目中摘取的】并非自己实际应用

    下面把项目中的用户类中有个:一对一  一对多  多对多的注解对应关系列取出来用于学习      说明:项目运行正常 问题类:一对多.一对一.多对多 ============一对多 一方的设置 @One ...

  2. Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作

    Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景: ​ ​ ​  ​ ​ 由于如果只使用一张表存储所有的数据,就会操作数 ...

  3. mybatis 一对一 一对多 多对多

    一对一 一对多 多对多

  4. day 69-70 一对一 一对多 多对一联表查询

    day 69 orm操作之表关系,多对多,多对一 多对一/一对多, 多对多{类中的定义方法} day69 1. 昨日内容回顾 1. 单表增删改查 2. 单表查询API 返回QuerySet对象的: 1 ...

  5. JPA 一对一 一对多 多对一 多对多配置

    1 JPA概述 1.1 JPA是什么 JPA (Java Persistence API) Java持久化API.是一套Sun公司 Java官方制定的ORM 方案,是规范,是标准 ,sun公司自己并没 ...

  6. MySQL一对一:一对多:多对多: 实例!!!!

    学生表和课程表可以多对多 一个学生可以学多门课程 一门课程可以有多个学生: 多对多 *** 一个学生对应一个班级 一个班级对应多个学生: 一对多 *** 一个老师对应多个学生 多个学生对应一个老师:一 ...

  7. 初学者易上手的SSH-hibernate04 一对一 一对多 多对多

    这章我们就来学习下hibernate的关系关联,即一对一(one-to-one),一对多(one-to-many),多对多(many-to-many).这章也将是hibernate的最后一章了,用于初 ...

  8. SQLAlchemy_定义(一对一/一对多/多对多)关系

    目录 Basic Relationship Patterns One To Many One To One Many To Many Basic Relationship Patterns 基本关系模 ...

  9. MySQL一对一:一对多:多对多

    学生表和课程表可以多对多 一个学生可以学多门课程 一门课程可以有多个学生: 多对多 *** 一个学生对应一个班级 一个班级对应多个学生: 一对多 *** 一个老师对应多个学生 多个学生对应一个老师:一 ...

随机推荐

  1. C++ 类里面,函数占用存储空间问题

    转载自:http://blog.163.com/xping_lsr/blog/static/19654034520119804131721/ 先看两段代码: 代码段1:class A{public:i ...

  2. GPUImage相关(转)

    3.滤镜 除了上面提到的美颜和水印之外,视频中还有很多其它的处理效果也在这个环节完成.七牛直播云提供的 SDK 在开放性设计基础之上,通过数据源回调接口,可以支持各种自定义滤镜的接入. 为了实现丰富的 ...

  3. TListView Header重绘和高度设置

    TListView 的 Header 部分默认 BtnFace 颜色,高度也不能改变.我们可以通过编写一些代码来实现这些功能: 获得TListView 的Header 的句柄: TListView的H ...

  4. Operate blob data in Oracle via C#

    oracle table: CREATE TABLE "SCOTT"."TEST_BLOB"    (    "NAME" VARCHAR2 ...

  5. Unity协程(Coroutine)原理深入剖析

    Unity协程(Coroutine)原理深入剖析 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 其实协程并没有那么复杂,网上很多地方都说是多 ...

  6. 【软件工程】用map 实现把英语文本文件词和个数打印出来

    #include <iostream> #include <fstream> #include <string> #include <map> usin ...

  7. nginx伪静态

    nginx 伪静态设置目录  /usr/local/nginx/conf/nginx/conf 1.域名绑定.server_name bbs.99vps.com; 2.网站根目录设置.root /ho ...

  8. 【Jquery mobile】动态加载ListView 转

    [Jquery mobile]动态加载ListView 分类: Jquery Mobile2011-12-01 09:04 13984人阅读 评论(1) 收藏 举报 jquerylistviewmob ...

  9. (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  10. 关于Android中混淆的问题

    1.签名打包后库依赖报错,提示找不到依赖库的方法. 原因:混淆,依赖库的方法被混淆了. 解决方法:过滤混淆,即不要混淆这依赖库的文件. -keep class de.greenrobot.event. ...