rexian

咨询电话:023-6276-4481

热门文章

联系方式

电 话:023-6276-4481

邮箱:broiling@qq.com

地址:重庆市南岸区亚太商谷6幢25-2

当前位置:网站首页 > 技术文章 > 流利的 API-关系

流利的 API-关系

编辑:Ethan 发表时间:2017-07-24 12:40:38
Ethan

使用 Fluent API 配置关系

注意: 此页提供了有关如何设置您使用 fluent API 的代码第一个模型中的关系信息。有关在关系的一般信息Ef和如何访问和操作数据使用关系,请参阅关系和导航属性。

当使用代码第一次,你Efine 您的模型由 dEf入会须知域 CLR 类。由 dEf行凶,实体框架使用代码第一次约定,您的类映射到的数据库架构。如果您使用的代码第一次的命名约定,在大多数情况下,你可以依靠代码第一次设置你的表之间的关系基础的外键和导航属性你 d Ef ine 的类。如果你不遵守公约 》 时 dEf入会须知您的类,或者如果您想要更改公约 》 的工作的方式,你可以使用流利的 API 或数据注释来配置您的类,因此代码第一次可以映射您的表之间的关系。

 

内容

  • 介绍

  • 配置要求-到-可选的关系 (–零-或-一对一)

  • 配置在两端都需要 (一对一) 的关系

  • 配置多对多关系

  • 与一个导航属性配置的关系

  • 启用级联删除

  • 配置一个复合的外键

  • 重命名一个外国的关键就是不 DEf模型中的氢离子浓度

  • 配置不遵循代码的第一个公约的外键名称

  • 在示例中使用的模型

 

介绍

当使用 fluent API 配置关系,你与 EntityTypeConfiguration 实例启动,然后使用 HasRequired、 HasOptional 或以很多种方法指定此实体参与的关系的类型。HasRequired 和 HasOptional 的方法采用 lambda 表达式来表示 rEf电池导航属性。有许多方法,采用 lambda 表达式来表示集合导航属性。然后可以通过使用 WithRequired,5000-15000 瓶和许多的方法来配置逆导航属性。这些方法有的重载,不带参数,可以用于指定基数与单向导航。

然后可以通过使用 HasForeignKey 方法来配置外键属性。此方法将 lambda 表达式表示要用作外键的属性。

 

配置要求-到-可选的关系 (–零-或-一对一)

下面的示例配置一个到零或一个关系。OfficeAssignment 已经是主键和外键,InstructorID 属性,因为属性的名称不符合公约 》 的 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);

 

配置在两端都需要 (一对一) 的关系

在大多数情况下实体框架可以推断出哪种类型是依赖,哪些是在关系中的主体。然而,当两端的关系需要或双方都可选实体框架无法识别的依赖和校长。当要求两端的关系时,在 HasRequired 方法之后使用 WithRequiredPrincipal 或 WithRequiredDependent。当两端的关系是可选的时在 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);

 

配置多对多关系

下面的代码配置课程和教师的类型之间的多对多关系。在以下示例中,dEf奥尔代码第一次约定被用来创建一个联接表。结果与 Course_CourseID 和 Instructor_InstructorID 的列创建 CourseInstructor 表。

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

 

如果你想要在你需要做额外的配置通过使用地图方法表中指定的联接表名称和列的名称。下面的代码生成 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");
    });

 

与一个导航属性配置的关系

(也称为单向) 单向关系是一个导航属性时 dEf董事关系结束只有一个而不是两个。按照约定,代码第一总是将解释作为一到多的单向关系。例如,如果你想要一对一的关系,教师和 OfficeAssignment,在那里你有导航属性只是教练的类型,你需要使用 fluent API 来配置这种关系。

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

modelBuilder.Entity<Instructor>()
    .HasRequired(t => t.OfficeAssignment)
    .WithRequiredPrincipal();

 

启用级联删除

通过使用 WillCascadeOnDelete 方法,可以在关系上配置级联删除。如果外键中的相关实体不是可以为 null 的然后代码第一次设置级联删除的关系。如果依赖实体上的外键是可以为 null,代码第一次不设置级联删除的关系,当删除主外键将被设置为 null。

您可以通过使用删除这些级联删除公约:

modelBuilder.Conventions.Remove < O Net oManyCascadeDeleteConvention >)
modelBuilder.Conventions.Remove < ManyToManyCascadeDeleteConvention >)

下面的代码配置需要的关系,然后禁用层叠删除。

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

 

配置一个复合的外键

如果主键部类型包括 DepartmentID 和名称属性,则应如下部和课程类型的外键配置主键:

// 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 });

 

重命名一个外国的关键就是不 DEf模型中的氢离子浓度

如果你选择不到 d Ef ine CLR 类型,但想要指定它起什么名字外的键应该在数据库中,执行下列操作:

modelBuilder.Entity<Course>()
    .HasRequired(c => c.Department)
    .WithMany(t => t.Courses)
    .Map(m => m.MapKey("ChangedDepartmentID"));

 

配置不遵循代码的第一个公约的外键名称

如果外键属性的课程类上调用了而不是 DepartmentID SomeDepartmentID,您将需要执行下列操作来指定您想要 SomeDepartmentID 是外键:

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

 

在示例中使用的模型

下面的代码第一个模型用于此页面上样本。

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; }
}