One to One 的数据库模型设计与NHibernate配置
|
在数据库模型设计中,最基本的实体关系有三种:一对一、一对多、多对多。关于一对多和多对多使用的情况较多,之前也有过一些讨论,现在来说明一下在数据库中一对一的模型设计。 首先,关系数据库中使用外键来表示一对多,使用中间表和两边的外键来表示多对多,而一对一的话有三种表示方式:一种是使用相同的主键值,第二种是使用单边的外键,第三种就是使用双边外键。 1.主键关联 比如我们在做一个ER系统时,设计了一个Employee表保存员工的基本信息(主表),另外有一个EmployeePhoto表(外表),用于保存员工的证件照,员工和照片之间就是一对一的关系。
} 下面是FluentNHibernate的Mapping配置:
{
EmployeeMap()
{
Table();
Id(x => x.Id,).GeneratedBy.HiLo();
Map(x => x.EmployeeNumber,).Not.Nullable();
Map(x => x.Name,).Not.Nullable();
HasOne(x => x.EmployeePhoto).Cascade.All();
}
}
EmployeePhotoMap : ClassMap
这里需要注意的是EmployeePhoto的主键,不再是普通的生成方式,而是要选择通过Employee做外键生成。 关于NHibernate 的one to one标签上的constrained="true",该标签在外表上设置,千万不要在主表上设置。就是说明这个表的主键与另一个表的主键建立外键约束,也就是说在生成SQL脚本时,会为这个表创建外键,如果不加,是不会创建外键的。另外还有一个作用,就是在查询外表时,如果没有设置该属性,那么就会Join主表,而设置了该属性,就只需要查询外表。 在主键关联的情况下,如果从主表中移除从表的引用,这个时候保存主表,是不会删除从表的,也不会删除这个一对一的关系的。也就是说,我们不能单独保留Employee和Photo表,同时还要去掉两者之间的关系。 2.单向外键关联 比如我们做个中学的管理系统,设计了一个Class表保存班级,另一个Classroom表保存教室,班级和教室是一对一的关系,一个班级有且仅有一个教室,一个教室属于0到1个班级。
|
- asp.net – 什么时候在普通的HTML上使用runat =“server”
- asp.net-mvc – ASP.Net MVC中的线程安全性
- asp.net-mvc – 在DropDownList中验证所需的选择
- asp.net-mvc-4 – 覆盖用于MVC4应用程序的User.IsInRole和[
- asp.net-mvc-4 – ValidateInput(false)vs AllowHtml
- asp.net – 从SyndicationContent读取内容文本
- asp.net-mvc – ASP.NET MVC中的Razor页面生命周期
- 在IIS中零停机上传/回滚
- asp.net – 使用回发解析.Net页面
- asp.net-mvc-3 – 在MVC3中使用Html.LabelFor的表单标签中的
