Relationship
EF支持三种类型的实体关系有1对1(0)、1对多、多对多,当在实体一端定义导航属性(navigation),则会自动定义为one-to-many关系。
关联端重数值:
- 一(1):表明在关联端存在且只存在一个实体类型实例
- 零或一(0…1):表明在关联端不存在实体类型或存在一个实体类型实例
- 多(*):表明在关联端不存在实体类型实例,或存在一个或多个实体类型实例
Optional:一个属性可拥有一个单个实例或没有
Required:一个属性必须拥有一个单个实例或多个(可拥有集合或单个实例)
配置两个实体之间的关系,同一个关系可分别从2个实体进行fluent,但实际只需要从一边配置即可。
方法 | 描述 |
HasRequired() | 从此实体类型配置必须关系 |
HasOptional() | 从此实体类型配置可选关系 |
HasMany() | 从此实体类型配置一对多关系 |
WithRequired() | 将关系配置为Optional:Required,且在关系另一端有导航属性 |
WithOptionalPrincipal() | 将关系配置为Optional:Optional,且在关系另一端无导航属性,要配置的实体类型将成为主体 |
WithOptionalDependent() | 将关系配置为Optional:Optional,且在关系另一端无导航属性,要配置的实体类型将成为依赖对象,且包含主体的外键 |
WithMany() | 将关系配置为Optional:Many,且在关系的另一端无导航属性 |
Configure One-to-Zero or One-to-One
一个实体类Entity1关联0个或者1个实体类Entity2,Entity1和Entity2之间必须有主键和外键约束,含有外键的为依赖体,没有外键的为主体,若主体和依赖体都互相有导航属性,则主体在持久化时导航属性可以为空,而依赖体在持久化时导航属性不能为空。下面是学生类和学生地址类的关系,学生实体类拥有1个或0个学生地址实体类。Student类中按照EF默认约定以StudentId为主键,StudentAddress以StudentAddressId为主键。所以只需要配置StudentAddress中StudentAddressId为外键。
通过DataAnnotations实现
通过Fluent API实现
分两种情况一种是主体和依赖体互相为必须关系,一种是任何一方为可选。
ü 配置必须-必须的关系
主体是Student,依赖体是studentAddress
当主体和依赖体为中的导航属性都不能为空时,可在引用HasRequired()方法后WithRequiredPrincipal()或WithRequiredDependent()来定义关系为必须-必须的;引用HasOptional()方法后WithOptionalPrincipal()和WithOptionalDependent()方法来定义可选-可选的关系。
//Map one-to- zero Relationship
modelBuilder.Entity<Instructor>().HasRequired(t => t.OfficeAssignment).WithRequiredPrincipal(t => t.Instructor);
ü 配置必须-可选的关系
OfficeAssignment定义InstructorID为主键和外键,然后Instructor定义了InstructorID为主键,且在OfficeAssignment和Instructor中都有导航属性。
//Map one-to-one Relationship
modelBuilder.Entity<OfficeAssignment>().HasRequired(t => t.Instructor).WithOptional(t => t.OfficeAssignment);
//Map one-to- zero Relationship
modelBuilder.Entity<Instructor>().HasRequired(t => t. OfficeAssignment).WithOptional();
ü 配置一个导航属性的单向关系
当在Instructor和OfficeAssignment中存在1:1的关系,但只有在Instructor中有一个导航属性,而在OfficeAssignment中无导航属性
modelBuilder.Entity<Instructor>().HasRequired(t => t.OfficeAssignment).WithRequiredPrincipal();
Configure One-to-Many
一个Studard类对应多个Student,即Studard包含多个Students,而每个student仅仅对应1个Studard。
通过DataAnnotations实现
通过Fluent API实现
当可有空外键的时候,就需要采用HasOptional方法进行配置
Configure Many-to-Many
多对多的关系是通过创建联接表来连接将这两个类名称组合在一起并包含外键属性,若是没有手动创建则系统会自动创建联接表。
Fluent API配置
上述关联表每个属性都是类名称和键属性的组合,左键应为所指向的第一个类的键,即Student,右键为关系的另一侧