ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-04-01 18:02:54  阅读:187  来源: 互联网

标签:API 关系 InstructorID Entity Fluent OfficeAssignment 文档 modelBuilder 主键


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有