Entity Framework Core 之Modeling Relationships

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

多对多的关系无法通过两个实体直接关联,可以借助第三个实体来关联两个多对多的实体。

 

 

posted @ 2017-12-12 20:32  Terrence_Sun  阅读(422)  评论(0)    收藏  举报