其他分享
首页 > 其他分享> > Fluent API文档搬运以及部分理解

Fluent API文档搬运以及部分理解

作者:互联网

Fluent API - 关系

简介

使用 Fluent API 配置关系时,请从 EntityTypeConfiguration 实例开始,然后使用 HasRequired、HasOptional 或 HasMany 方法指定此实体参与的关系类型。 HasRequired 和 HasOptional 方法采用表示引用导航属性的 Lambda 表达式。 HasMany 方法采用表示集合导航属性的 Lambda 表达式。 然后,可以使用 WithRequired、WithOptional 和 WithMany 方法配置反向导航属性。 这些方法具有不带参数的重载,可用于指定单向导航的基数。

然后,可以使用 HasForeignKey 方法配置外键属性。 此方法采用的 Lambda 表达式表示要用作外键的属性。

 

配置必需对可选关系(一对零或一)

以下示例将配置一对零或一的关系。 OfficeAssignment 具有 InstructorID 属性(前者是主键,后者是外键//这块文档感觉翻译的有问题,应该是既是主键又是外键),因为该属性的名称未遵循 HasKey 方法用于配置主键的约定。

// Configure the primary key for the OfficeAssignment
//指定OfficeAssignment的主键是InstructorID
modelBuilder.Entity<OfficeAssignment>() .HasKey(t => t.InstructorID); // Map one-to-zero or one relationship
//第一个HasRequired设定OfficeAssignment是如果有OfficeAssignment,因为其主键身份,InstructorID一定存在,但是因为其外键身份,如果没有OfficeAssignment,也不能说InstructorID一定不存在(可能存在也可能不存在)。
所以这个一对0或一,是一个存在的Instuctor对象,有可能对应一个OfficeAssignment对象(因为InstructorID是officeAssignment的主键唯一),也有可能对应0个OfficeAssignment(因为InstructorID是officeassignment的外键).
换个说法说,主键是1和0(要么不存在,要么唯一),外键是0到很多,那么他即是主键又是外键,就取他俩的共同特点,就是0或1
modelBuilder.Entity<OfficeAssignment>() .HasRequired(t => t.Instructor) .WithOptional(t => t.OfficeAssignment);

 

配置两端均为必需类型的关系(一对一)

在大多数情况下,实体框架可以推断出某个关系中哪个类型是从属,哪个类型是主体。 但是,如果关系的两端都是必需类型或者都是可选类型,实体框架就无法识别从属和主体。 如果关系的两端都是必需类型,请在 HasRequired 方法之后使用 WithRequiredPrincipal 或 WithRequiredDependent。 如果关系的两端都是可选类型,请在 HasOptional 方法之后使用 WithOptionalPrincipal 或 WithOptionalDependent。

// Configure the primary key for the OfficeAssignment
modelBuilder.Entity<OfficeAssignment>()
    .HasKey(t => t.InstructorID);

// 这个上面说明的很明确了,唯一的需要说明的是,WithOptionalPrincipal表示的是Instructor是主,OfficeAssignment是从,使用WithOptionalDependent则反过来,所以当配置OfficeAssignment的时候,就需要使用WithOptionalDependent了 modelBuilder.Entity<Instructor>() .HasRequired(t => t.OfficeAssignment) .WithRequiredPrincipal(t => t.Instructor);

 

 

配置多对多关系

以下代码将在 Course 和 Instructor 类型之间配置一个多对多关系。 在以下示例中,使用默认 Code First 约定创建联接表。 因此,CourseInstructor 表是用 Course_CourseID 和 Instructor_InstructorID 列创建的。(多对多关系本质上是创建一个包含两个连接键的新表)

modelBuilder.Entity<Course>()
    .HasMany(t => t.Instructors)
    .WithMany(t => t.Courses)

如果要指定联接表名称和表中列的名称,需要使用 Map 方法进行额外的配置。 以下代码将生成包含 CourseID 和 InstructorID 列的 CourseInstructor 表。

modelBuilder.Entity<Course>()
    .HasMany(t => t.Instructors)
    .WithMany(t => t.Courses)
    .Map(m =>
    {
        m.ToTable("CourseInstructor");
        m.MapLeftKey("CourseID");
        m.MapRightKey("InstructorID");
    });

 

使用一个导航属性配置关系

单向关系是指仅在关系的一端而不是两端定义导航属性。 按照约定,Code First 始终将单向关系解释为一对多。 例如,如果你希望在 Instructor 和 OfficeAssignment 之间建立一对一的关系(只有 Instructor 类型上有导航属性),则需要使用 Fluent API 来配置此关系。

// Configure the primary Key for the OfficeAssignment
modelBuilder.Entity<OfficeAssignment>()
    .HasKey(t => t.InstructorID);

//这个是上面一对0或一的延续,意思就是一对0或1的关系,我们按照一对多的方式来配置的话,那么就会实现一对一的效果
modelBuilder.Entity<Instructor>()
    .HasRequired(t => t.OfficeAssignment)
    .WithRequiredPrincipal();

 

标签:API,关系,InstructorID,Entity,Fluent,OfficeAssignment,文档,modelBuilder,主键
来源: https://www.cnblogs.com/zmy2020/p/16088215.html