咨詢電話:023-6276-4481
熱門文章
電 話:023-6276-4481
郵箱:broiling@qq.com
地址:重慶市南岸區(qū)亞太商谷6幢25-2
注意: 此頁提供了有關(guān)如何設(shè)置您使用 fluent API 的代碼第一個(gè)模型中的關(guān)系信息。有關(guān)在關(guān)系的一般信息Ef和如何訪問和操作數(shù)據(jù)使用關(guān)系,請(qǐng)參閱關(guān)系和導(dǎo)航屬性。
當(dāng)使用代碼第一次,你Efine 您的模型由 dEf入會(huì)須知域 CLR 類。由 dEf行兇,實(shí)體框架使用代碼第一次約定,您的類映射到的數(shù)據(jù)庫架構(gòu)。如果您使用的代碼第一次的命名約定,在大多數(shù)情況下,你可以依靠代碼第一次設(shè)置你的表之間的關(guān)系基礎(chǔ)的外鍵和導(dǎo)航屬性你 d Ef ine 的類。如果你不遵守公約 》 時(shí) dEf入會(huì)須知您的類,或者如果您想要更改公約 》 的工作的方式,你可以使用流利的 API 或數(shù)據(jù)注釋來配置您的類,因此代碼第一次可以映射您的表之間的關(guān)系。
介紹
配置要求-到-可選的關(guān)系 (–零-或-一對(duì)一)
配置在兩端都需要 (一對(duì)一) 的關(guān)系
配置多對(duì)多關(guān)系
與一個(gè)導(dǎo)航屬性配置的關(guān)系
啟用級(jí)聯(lián)刪除
配置一個(gè)復(fù)合的外鍵
重命名一個(gè)外國(guó)的關(guān)鍵就是不 DEf模型中的氫離子濃度
配置不遵循代碼的第一個(gè)公約的外鍵名稱
在示例中使用的模型
當(dāng)使用 fluent API 配置關(guān)系,你與 EntityTypeConfiguration 實(shí)例啟動(dòng),然后使用 HasRequired、 HasOptional 或以很多種方法指定此實(shí)體參與的關(guān)系的類型。HasRequired 和 HasOptional 的方法采用 lambda 表達(dá)式來表示 rEf電池導(dǎo)航屬性。有許多方法,采用 lambda 表達(dá)式來表示集合導(dǎo)航屬性。然后可以通過使用 WithRequired,5000-15000 瓶和許多的方法來配置逆導(dǎo)航屬性。這些方法有的重載,不帶參數(shù),可以用于指定基數(shù)與單向?qū)Ш健?/p>
然后可以通過使用 HasForeignKey 方法來配置外鍵屬性。此方法將 lambda 表達(dá)式表示要用作外鍵的屬性。
下面的示例配置一個(gè)到零或一個(gè)關(guān)系。OfficeAssignment 已經(jīng)是主鍵和外鍵,InstructorID 屬性,因?yàn)閷傩缘拿Q不符合公約 》 的 HasKey 方法用于配置的主鍵。
// Configure the primary key for the OfficeAssignment modelBuilder.Entity<OfficeAssignment>() .HasKey(t => t.InstructorID); // Map one-to-zero or one relationship modelBuilder.Entity<OfficeAssignment>() .HasRequired(t => t.Instructor) .WithOptional(t => t.OfficeAssignment);
在大多數(shù)情況下實(shí)體框架可以推斷出哪種類型是依賴,哪些是在關(guān)系中的主體。然而,當(dāng)兩端的關(guān)系需要或雙方都可選實(shí)體框架無法識(shí)別的依賴和校長(zhǎng)。當(dāng)要求兩端的關(guān)系時(shí),在 HasRequired 方法之后使用 WithRequiredPrincipal 或 WithRequiredDependent。當(dāng)兩端的關(guān)系是可選的時(shí)在 HasOptional 方法之后使用 WithOptionalPrincipal 或 WithOptionalDependent。
// Configure the primary key for the OfficeAssignment modelBuilder.Entity<OfficeAssignment>() .HasKey(t => t.InstructorID); modelBuilder.Entity<Instructor>() .HasRequired(t => t.OfficeAssignment) .WithRequiredPrincipal(t => t.Instructor);
下面的代碼配置課程和教師的類型之間的多對(duì)多關(guān)系。在以下示例中,dEf奧爾代碼第一次約定被用來創(chuàng)建一個(gè)聯(lián)接表。結(jié)果與 Course_CourseID 和 Instructor_InstructorID 的列創(chuàng)建 CourseInstructor 表。
modelBuilder.Entity<Course>() .HasMany(t => t.Instructors) .WithMany(t => t.Courses)
如果你想要在你需要做額外的配置通過使用地圖方法表中指定的聯(lián)接表名稱和列的名稱。下面的代碼生成 CourseID 和 InstructorID 列的 CourseInstructor 表。
modelBuilder.Entity<Course>() .HasMany(t => t.Instructors) .WithMany(t => t.Courses) .Map(m => { m.ToTable("CourseInstructor"); m.MapL Ef tKey("CourseID"); m.MapRightKey("InstructorID"); });
(也稱為單向) 單向關(guān)系是一個(gè)導(dǎo)航屬性時(shí) dEf董事關(guān)系結(jié)束只有一個(gè)而不是兩個(gè)。按照約定,代碼第一總是將解釋作為一到多的單向關(guān)系。例如,如果你想要一對(duì)一的關(guān)系,教師和 OfficeAssignment,在那里你有導(dǎo)航屬性只是教練的類型,你需要使用 fluent API 來配置這種關(guān)系。
// Configure the primary Key for the OfficeAssignment modelBuilder.Entity<OfficeAssignment>() .HasKey(t => t.InstructorID); modelBuilder.Entity<Instructor>() .HasRequired(t => t.OfficeAssignment) .WithRequiredPrincipal();
通過使用 WillCascadeOnDelete 方法,可以在關(guān)系上配置級(jí)聯(lián)刪除。如果外鍵中的相關(guān)實(shí)體不是可以為 null 的然后代碼第一次設(shè)置級(jí)聯(lián)刪除的關(guān)系。如果依賴實(shí)體上的外鍵是可以為 null,代碼第一次不設(shè)置級(jí)聯(lián)刪除的關(guān)系,當(dāng)刪除主外鍵將被設(shè)置為 null。
您可以通過使用刪除這些級(jí)聯(lián)刪除公約:
modelBuilder.Conventions.Remove < O Net oManyCascadeDeleteConvention >)
modelBuilder.Conventions.Remove < ManyToManyCascadeDeleteConvention >)
下面的代碼配置需要的關(guān)系,然后禁用層疊刪除。
modelBuilder.Entity<Course>() .HasRequired(t => t.Department) .WithMany(t => t.Courses) .HasForeignKey(d => d.DepartmentID) .WillCascadeOnDelete(false);
如果主鍵部類型包括 DepartmentID 和名稱屬性,則應(yīng)如下部和課程類型的外鍵配置主鍵:
// Composite primary key modelBuilder.Entity<Department>() .HasKey(d => new { d.DepartmentID, d.Name }); // Composite foreign key modelBuilder.Entity<Course>() .HasRequired(c => c.Department) .WithMany(d => d.Courses) .HasForeignKey(d => new { d.DepartmentID, d.DepartmentName });
如果你選擇不到 d Ef ine CLR 類型,但想要指定它起什么名字外的鍵應(yīng)該在數(shù)據(jù)庫中,執(zhí)行下列操作:
modelBuilder.Entity<Course>() .HasRequired(c => c.Department) .WithMany(t => t.Courses) .Map(m => m.MapKey("ChangedDepartmentID"));
如果外鍵屬性的課程類上調(diào)用了而不是 DepartmentID SomeDepartmentID,您將需要執(zhí)行下列操作來指定您想要 SomeDepartmentID 是外鍵:
modelBuilder.Entity<Course>() .HasRequired(c => c.Department) .WithMany(d => d.Courses) .HasForeignKey(c => c.SomeDepartmentID);
下面的代碼第一個(gè)模型用于此頁面上樣本。
using System.Data.Entity; using System.Data.Entity.ModelConfiguration.Conventions; // add a r Ef erence to System.ComponentModel.DataAnnotations DLL using System.ComponentModel.DataAnnotations; using System.Collections.Generic; using System; public class SchoolEntities : DbContext { public DbSet<Course> Courses { get; set; } public DbSet<Department> Departments { get; set; } public DbSet<Instructor> Instructors { get; set; } public DbSet<OfficeAssignment> OfficeAssignments { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { // Configure Code First to ignore PluralizingTableName convention // If you keep this convention then the generated tables will have pluralized names. modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); } } public class Department { public Department() { this.Courses = new HashSet<Course>(); } // Primary key public int DepartmentID { get; set; } public string Name { get; set; } public decimal Budget { get; set; } public System.DateTime StartDate { get; set; } public int? Administrator { get; set; } // Navigation property public virtual ICollection<Course> Courses { get; private set; } } public class Course { public Course() { this.Instructors = new HashSet<Instructor>(); } // Primary key public int CourseID { get; set; } public string Title { get; set; } public int Credits { get; set; } // Foreign key public int DepartmentID { get; set; } // Navigation properties public virtual Department Department { get; set; } public virtual ICollection<Instructor> Instructors { get; private set; } } public partial class OnlineCourse : Course { public string URL { get; set; } } public partial class OnsiteCourse : Course { public OnsiteCourse() { Details = new Details(); } public Details Details { get; set; } } public class Details { public System.DateTime Time { get; set; } public string Location { get; set; } public string Days { get; set; } } public class Instructor { public Instructor() { this.Courses = new List<Course>(); } // Primary key public int InstructorID { get; set; } public string LastName { get; set; } public string FirstName { get; set; } public System.DateTime HireDate { get; set; } // Navigation properties public virtual ICollection<Course> Courses { get; private set; } } public class OfficeAssignment { // Specifying InstructorID as a primary [Key()] public Int32 InstructorID { get; set; } public string Location { get; set; } // When the Entity Framework sees Timestamp attribute // it configures ConcurrencyCheck and DatabaseGeneratedPattern=Computed. [Timestamp] public Byte[] Timestamp { get; set; } // Navigation property public virtual Instructor Instructor { get; set; } }