Relationships (关系)
关系定义了两个实体之间的联系,在数据库关系中用外键约束来表示两个实体之间的联系。默认情况下若在模型类型中发现了导航属性就会创建关系。最常见的关系模式是导航属性定义两端的关系,外键属性定义两者之间的依赖。
1) 术语定义
Dependent entity:依赖实体,包含外键属性的实体,在关系中称为孩子的一方
Principal entity:主体实体,包含主键/候补键的实体,在关系中成为父亲的一方
Foreign key:外键,在依赖实体中的属性,用于存储主体实体中的主键值
Principal key:主体键,在主体实体中唯一属性,用于存储主键或候补键
Navigation property:导航属性,在主体或依赖体重定义的属性,用于关联两者
Collection navigation property:集合导航属性,引用多个实体集合的导航属性
Reference navigation property:参考导航属性,引用单个实体的导航属性
Inverse navigation property:逆导航属性,在主体与依赖体中互相导航的属性
下面代码展示了Blog模型对象类与Post类之间一对多的关系
Post 是一个依赖实体
Blog 是一个主体实体
Post.BlogId 是一个外键
Blog.BlogId 是一个主体键 (在此更多代表的是主键,而非候补键)
Post.Blog是一个reference navigation property
Blog.Posts是一个 collection navigation property
Post.Blog 是 the inverse navigation property of Blog.Posts
2) 完全定义的关系(Fully Defined Relationships)
最普通的关系模式是在两个关系实体中都定义导航属性互相导航,且在依赖实体类中定义外键属性。当在两个实体中定义导航属性,则互为逆向导航;当依赖实体类中包含以下格式的属性时<primary key property name>,<navigation property name><primary key property name>, or<principal entity name><primary key property name>都将此类属性默认为外键属性。
3) 没有外键的属性(No Foreign Key Property)
可在一个依赖实体中定义一个外键属性且非必需的。若没有发现外键属性,一个引用外键属性将被同样定义<navigation property name><principal key property name>
4) 单向导航属性(Single Navigation Property)
当只有一个导航属性,没有逆向导航和外键属性时,可选择单个导航属性。单向导航属性存在时,可以使用它Fluent API来标志两者关系。
5) 关系之间的Data Annotations
在关系中可以用2种数据特性来标识关系,分别是[ForeignKey] and [InverseProperty]
以下是通过ForeignKey来标识导航属性的外键
通过逆向导航数据特性来标识主体实体和依赖实体之间的导航信息[InverseProperty]
6) 关系之间的Fluent API
通过导航属性识别的关系,用HasOne or HasMany标识需要配置的导航属性,然后通过WithOne or WithMany继续链接来配置逆向导航属性
One-to-One Relationship
1:1的关系在两个关联实体中分别都有一个关联导航属性,但是在依赖实体中必须显式有一个外键属性来标识,另一个则是主体实体
Many-To-Many Relationship
多对多的关系无法通过两个实体直接关联,可以借助第三个实体来关联两个多对多的实体。