[asp.net-mvc]使用 Fluent Api-实体框架的实体关系映射

发布时间: 2017/3/25 11:05:32
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有以下实体在应用程序中。

Student
Parent (This Parent can be Father/Guardian)
Address

他们有以下定义的类。

public Class Student
{
    public int StudentId {get; set;}

    //Addresses
    public Address TemporaryAddress {get;set;}
    public Address PermanentAddress {get;set;}

    //Parent
    public Parent Father {get;set;}
    public Parent Guardian {get;set;}
}

public class Parent
{
    public int ParentId {get;set;}
    public string Name {get;set;}

    //Addresses
    public Address TemporaryAddress {get;set;}
    public Address PermanentAddress {get;set;}

}

public class Address
{
    public int AddressId {get;set;}
    public string Country  {get;set;}
    public string State  {get;set;}
    public string Town  {get;set;}
    public string House#  {get;set;}
}

我想有以下排序的关系,它们之间

Student
        ->TemporaryAddress (Address)
        ->PermanentAddress (Address)
        ->Father           (Parent)
                ->TemporaryAddress (Address)
                ->PermanentAddress (Address)
        ->Guardian         (Parent)
                ->TemporaryAddress (Address)
                ->PermanentAddress (Address)

换句话说,

学生都有一个TemporaryAddress和一个PermanentAddress。 学生有一位父亲和一位守护者(他们都可以是相同即卫报 》 也是父亲的) 父母 (父亲或监护人) 有 TemporaryAddress 和 PermanentAddress。

怎样达到这个使用实体框架 Fluent Api?什么其他领域需要添加地址和父实体,使这种关系成为可能。

谢谢你。

解决方法 1:

您所提供的类使用实体框架创建必需的表和关系,从你的问题尚不完全清楚什么你所面对的问题。然而,我假定您希望 ParentAddress 非可选而不是由实体框架创建的都是可选的默认关系的关系。

您可以使用 fluent API 指定关系是必需。这里它指定的 Student 需要一个非 null 值的 Father 属性︰

modelBuilder
  .Entity<Student>()
  .HasRequired(p => p.Father);

实体框架将在默认情况下添加外键关系所以删去说级联删除 Parent 行将删除关联的 Address 行。然而,作为你可以重用 ParentAddress 行你要关闭此功能。这可以做为整个 DbContext 通过删除 OneToManyCascadeDeleteConvention

这在一起让你可以创建 DbContext 使用 fluent API:

public class Context : DbContext {

  public IDbSet<Student> Students { get; set; }

  public IDbSet<Parent> Parents { get; set; }

  public IDbSet<Address> Addresses { get; set; }

  protected override void OnModelCreating(DbModelBuilder modelBuilder) {
    modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
    modelBuilder
      .Entity<Student>()
      .HasRequired(p => p.Father);
    modelBuilder
      .Entity<Student>()
      .HasRequired(p => p.Guardian);
    modelBuilder
      .Entity<Student>()
      .HasRequired(p => p.PermanentAddress);
    modelBuilder
      .Entity<Student>()
      .HasRequired(p => p.TemporaryAddress);
    modelBuilder
      .Entity<Parent>()
      .HasRequired(p => p.PermanentAddress);
    modelBuilder
      .Entity<Parent>()
      .HasRequired(p => p.TemporaryAddress);
  }

}
官方微信
官方QQ群
31647020