版本
1.2 [2006-11-13]
简介
本手册演示NBearV3支持的所有实体关系设计的完全参考。包括1对1,1对多,多对多关联以及自关联的正向、反向引用时的所有情况的设计方法。
注1:本手册并不讨论继承关系。因为,继承关系自然映射到设计实体接口的继承,无需太多额外讨论。
注2:所有的关联在演示中都包含了正向和反向的可读写引用,在实际的项目中,一般并不总是需要同时有正向和反向引用,可以只在一个方向包含引用,或一方包含引用,另一方只包含一个外键ID,也可以只包含只读的引用。并且,在双向引用时,绝对不能同时设置为双向的LazyLoad=false。
注3:所有关联关系中的正向或反向引用的属性,根据需要,可以添加ContainedAttribute标识,以实现属性和包含属性的实体的级联更新/删除。在本文演示的所有引用中都没有包含ContainedAttribute,实际项目中请注意添加,但是不要同时在正向和反向引用属性中添加ContainedAttribute。
注4:在阅读本文之前,建议读者先阅读《NBearV3 Step by Step教程——ORM篇》以掌握NBearV3中有关ORM的基本知识。
代码
本手册演示的所有类图和代码,包含于可以从sf.net下载的NBearV3最新源码zip包中的tutorials\Entity_Relation_Manual目录中。因此,在使用本手册的过程中如有任何疑问,可以直接参考这些代码。
正文
一、1对1主键关联
分析:一对一主键关联指的是两个实体通过相同的主键进行关联。典型的关联关系如图中的User和UserProfile的关联。其中,UserProfile不能脱离具有相同主键值的User存在。因此,实际上,对于UserProfile来说,它的属性UserID既是它的PK,又是一个关联到User的FK,且UserProfile.UserID应该对User.ID有引用完整性约束。
public interface User : Entity
{
[PrimaryKey]
Guid ID { get; set; }
string Name { get; set; }
[PkQuery(LazyLoad=true)]
UserProfile Profile
{
get;
set;
}
}
public interface UserProfile : Entity
{
[PrimaryKey]
[FriendKey(typeof(User))]
Guid UserID { get; set; }
string Content { get; set; }
[PkReverseQuery(LazyLoad = true)]
User User
{
get;
set;
}
}