• 23/10/2016
    • A

    • o

本文 内容

备注

本页 提供 有关 使用 Fluent API 设置 Code First 模型 中 的 关系 的 信息。 有关 EF 中 的 关系 以及 如何 使用 关系 访问 和 操作 数据 的 一般 信息 , 请 参阅 关系 & 导航 属性。

First Code First 时 , 可 通过 定义 域 CLR 类 定义 模型。 默认 情况 下 , 实体 框架 使用 Code First 约定 将 类 映射 到 数据库 架构。 如果 你 使用 Code First 命名 约定 , 则 在 大多数 情况 下 , 你 可以 依赖 于Code First 根据 你 在 类 上 定义 的 外 键 和 导航 属性 来 设置 表 之间 的 关系。 如果 在 类 时 不 遵循 约定 , 或者 若要 更改 约定 的 工作 方式 , 可以 使用 Fluent API 或 数据 批注 来 配置 类, 以便 Code First 可以 映射 表 之间 的 关系。

简介

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

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

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

下面 的 示例 将 配置 一 对 零 或 一 关系。 OfficeAssignment 具有 InstructorID 属性 , 该 属性 是 主 键 外 键 , 因为 属性 的 名称 不 遵循 该 约定。 HasKey 方法 用于 配置 主 键。

// Configurati cheia principala pentru modelul OfficeAssignment modelBuilder.Entity <OfficeAssignment> () .HasKey (t => t.InstructorID); // Harta unu-la-zero sau o relatie modelBuilder.Entity <OfficeAssignment> (). AreRequired (t => t.Instructor) .WithOptional (t => t.OfficeAssignment);

配置 一种 关系 , 在 这种 情况 下 , 这 两个 端 都 需要 (一对一)

在 大多数 情况 下 实体 框架 可以 推断 哪个 类型 是 依赖 项 并且 是 关系 中 的 主体。 但是 , 如果 需要 的 两端 , 或者 两个 两侧 都是 的 的 , 则 实体 框架 无法 识别 依赖 项 和 主体。 如果 关系 的 两端 都是 必需 的 , 请 在 HasRequired 方法 后面 使用 WithRequiredPrincipal 或 WithRequiredDependent。 如果 关系 两端 都是 可选 的 , 请 在 HasOptional 方法 后面 使用 WithOptionalPrincipal 或 WithOptionalD

// Configurati cheia principala pentru OfficeAssignment modelBuilder.Entity <OfficeAssignment> () .HasKey (t => t.InstructorID); modelBuilder.Entity <Instructor> () .HasRequired (t => t.OfficeAssignment) .WithRequiredPrincipal (t => t.Instructor);

配置 多对多 关系

First 的 代码 配置 课程 类型 和 指导员 类型 之间 的 多对多 关系。 在 的 的 示例 中 , 使用 了 First Code First 约定 来 创建 联接 表。 因此 , Courseinstructor.courseid 表 是 使用 Course_CourseID 和 Instructor_InstructorID。 创建 创建

modelBuilder.Entity <Curs> () .HasMany (t => t.Instructori) .WithMany (t => t.Cursuri)

如果 要 使用 Map 方法 指定 联接 表 名称 和 表 中 列 的 名称 , 则 需要 执行 其他 配置。 的 的 代码 生成 包含 CourseID 和 InstructorID 列 的 Courseinstructor.courseid 表。

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

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

First 单向 (也 称为 单向) 关系 , 只是 在 一个 关系 端 上 定义 导航 属性 , 而 不是 在 上 定义。 按照 约定 , Code First 始终 将 单向 关系 解释 为 一对多。 例如 , 如果你 想要 在 讲师 与 OfficeAssignment 之间 进行 一对一 关系 , 其中 仅有 指导员 的 的 导航 属性 , 则 需要 使用 API fluent 来 配置 此 关系。

// Configurati cheia primara pentru modelul OfficeAssignment modelBuilder.Entity <OfficeAssignment> () .HasKey (t => t.InstructorID); modelBuilder.Entity <Instructor> () .HasRequired (t => t.

colegialas cachondas abuelas porno españolas
peliculas porno de viejas follando a mi compañera de piso
zofilia vende a su novia por dinero
tetonas en la playa viejas anales
porno espania me follo a mi madre
maduritas corriendose porno espania
porno sin censura follando en el monte
ver peliculas de incesto mujeres maduras corriendose
violacion real porno tetas amaters
corrida en el culo follando con mi amante
pajas caseras videos chicas gratis
abuelas ardientes amas de casa infieles
vecinasxxx le pilla masturbandose
follándosela intercambio amateur
jovencitas muy calientes videos ponos
española follando porno loco
masajes porno en español jovencitas muy calientes
mia kalifa putasfollando
videos incesto online porno libre
lesbianas scat porno caliente

OfficeAssignment) .WithRequiredPrincipal ();

启用 级联 删除

您 可以 通过 使用 WillCascadeOnDelete 方法 为 关系 配置 级联 删除。 如果 从属 实体 的 的 外 键 不可 为 null , 则 Code First 在 关系 上 设置 级联 删除 如果 从属 实体 上 的 外 键 可 为 ull , 则 Code会对 关系 设置 级联 删除 , 并且 在 删除 主体 时 , 外 键 将 设置 为 null。

您 可以 使用 以下 方法 删除 这些 级联 删除 约定 :

modelBuilder <OneToManyCascadeDeleteConvention> (# A1

modelBuilder <ManyToManyCascadeDeleteConvention> (# A1

下面 的 代码 将 关系 配置 为 “必需” , 然后 禁用 级联 删除。

modelBuilder.Entity <Curs> () .HasRequired (t => t.Department) .WithMany (t => t.Courses) .HasForeignKey (d => d.DepartmentID) .WillCascadeOnDelete (false);

配置 复合 外 键

ID 部门 类型 上 的 主 键 由 DepartmentID 和 Name 属性 组成 , 则 可以 为该 部门 配置 主 键 并 为 课程 类型 配置 外 键 , 如下 所示 :

// Cheie primara compusa modelBuilder.Entity <Department> () .HasKey (d => new {d.DepartmentID, d.Name}); // Model de chei straine compozite ModelBuilder.Entity <Course> () .HasRequired (c => c.Department) .WithMany (d => d.Courses). ;

重 命名 未 在 模型 中 定义 的 外 键

如果 选择 不在 CLR 类型 上 定义 外 键 , 但 要 指定 它 应 在 数据库 中 具有 的 名称 , 请 执行 以下 操作 :

modelBuilder.Entity <Curs> () .HasRequired (c => c.Department) .WithMany (t => t.Courses) .Map (m => m.MapKey (“ChangedDepartmentID”));

配置 不 遵循 Code First 约定 的 外 键 名称

如果 课程 类 的 外 键 属性 称为 SomeDepartmentID 而 不是 DepartmentID , 则 需要 执行 以下 操作 , 以 指定 要 SomeDepartmentID 为 外 键 :

modelBuilder.Entity <Curs> () .HasRequired (c => c.Department) .WithMany (d => d.Courses) .HasForeignKey (c => c.SomeDepartmentID);

示例 中 使用 的 模型

以下 Primul cod 模型 用于 此 页 上 的 示例。

folosind System.Data.Entity; folosind System.Data.Entity.ModelConfiguration.Conventions; // adaugati o referinta la System.ComponentModel.DataAnnotations DLL utilizand System.ComponentModel.DataAnnotations; folosind System.Collections.Generic; utilizarea sistemului; public class SchoolEntities: DbContext {public DbSet <Course> Courses {get; a stabilit; } public DbSet <Department> Departments {get; a stabilit; } public DbSet <Instructor> Instructori {get; a stabilit; } public DbSet <OfficeAssignment> OfficeAssignments {get; a stabilit; } protected override void OnModelCreating (DbModelBuilder modelBuilder) {// Configurati mai intai codul pentru a ignora conventia PluralizingTableName // Daca pastrati aceasta conventie, atunci tabelele generate vor avea nume pluralizate. modelBuilder.Conventions.Remove <PluralizingTableNameConvention> (); }} public class Department {public Department () {this.Courses = new HashSet <Course> (); } // Cheia primara publica ID departament {get; a stabilit; } public string Nume {get; a stabilit; } buget public zecimal {get; a stabilit; } public System.DateTime StartDate {get; a stabilit; } public int? Administrator {get; a stabilit; } // Navigare proprietate publica virtuala ICollection <Curs> Cursuri {get; set privat; }} public class Course {public Course () {this.Instructors = new HashSet <Instructor> (); } // Cheie primara publica int CursID {get; a stabilit; } sir public Titlu {get; a stabilit; } public int Credite {get; a stabilit; } // Cheie straina publica ID departament {get; a stabilit; } // Navigare proprietati publice virtuale Departament Departament {get; a stabilit; } public virtual ICollection <Instructor> Instructori {get; set privat; }} curs partial public OnlineCourse: Curs {public string URL {get; a stabilit; }} clasa partiala publica OnsiteCourse: Curs {public OnsiteCourse () {Details = new Details (); } public Detalii Detalii {get; a stabilit; }} public class Detalii {public System.DateTime Time {get; a stabilit; } public string Locatie {get; a stabilit; } public string Days {get; a stabilit; }} public class Instructor {public Instructor () {this.Courses = new List <Course> (); } // Cheia primara publica in ID Instructor {get; a stabilit; } sir public LastName {get; a stabilit; } sir public FirstName {get; a stabilit; } public System.DateTime HireDate {get; a stabilit; } // Proprietati de navigatie public virtual ICollection <Curs> Cursuri {get; set privat; }} public class OfficeAssignment {// Specifying InstructorID as a primary [Key ()] public Int32 InstructorID {get; a stabilit; } public string Locatie {get; a stabilit; } // Cand Entity Framework vede atributul Timestamp // acesta configureaza ConcurrencyCheck si DatabaseGeneratedPattern = Computed. [Timestamp] octet public [] Timestamp {get; a stabilit; } // Proprietate de navigare publica virtuala Instructor Instructor {get; a stabilit; }}