1. 程式人生 > 其它 >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();