博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EntityFramework6.X 之Relationship
阅读量:5235 次
发布时间:2019-06-14

本文共 2333 字,大约阅读时间需要 7 分钟。

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,右键为关系的另一侧

转载于:https://www.cnblogs.com/Terrece/p/7110417.html

你可能感兴趣的文章
图论-次短路求法
查看>>
What's New for Visual C# 6.0
查看>>
ExtJs学习笔记之ComboBox组件
查看>>
关于收费软件
查看>>
getopt_long
查看>>
TensorFlow MNIST CNN 代码
查看>>
javascript之Style物
查看>>
JSON跨域解决方案收集
查看>>
SSH框架整合总结
查看>>
图的深度优先遍历
查看>>
C# 之 提高WebService性能大数据量网络传输处理
查看>>
md5sum命令详解
查看>>
[bzoj1004] [HNOI2008] Cards
查看>>
应该是实例化对象的没有对属性赋值时,自动赋值为null,但不是空指针对象引用...
查看>>
原生HttpClient详细使用示例
查看>>
几道面试题
查看>>
Factory Design Pattern
查看>>
python中贪婪与非贪婪
查看>>
guava API整理
查看>>
无锁编程笔记
查看>>