使用FluentAPI的EF Code-First一对一关系

时间:2018-07-21 14:42:50

标签: asp.net-mvc ef-fluent-api

我有两个FluentAPI类。我使用EF Code First方法。一个是ClientAdmin,另一个是学校。我想让ClientAdmin的ID成为学校表的主键

我的ClientAdmin FluentAPI类如下

public ClientAdminMap()
        {
            this.ToTable("ClientAdmin");
            this.HasKey(v => v.Id);

            this.Property(v => v.Name).IsRequired().HasMaxLength(400);
            this.Property(v => v.Email).HasMaxLength(400);
            this.Property(v => v.MetaKeywords).HasMaxLength(400);
            this.Property(v => v.MetaTitle).HasMaxLength(400);
            this.Property(v => v.PageSizeOptions).HasMaxLength(200);
        }

另一个类如下

public SchoolMapper()
        {
            this.ToTable("School");
            this.HasKey(bp => bp.Id);
            this.Property(bp => bp.Title).IsRequired();

            this.HasRequired(bp => bp.Language)
                .WithMany()
                .HasForeignKey(bp => bp.LanguageId).WillCascadeOnDelete(true);
        }

我该如何实现?请帮忙。

1 个答案:

答案 0 :(得分:0)

根据您的问题,您需要一个one-to-one关系,而ClientAdmin是这种关系的主体。

在首先使用代码并想要以这种方式创建one-to-one时,您唯一要做的就是向EF指示哪个实体是主要,哪个实体是< strong>依赖。

此外,您还必须决定是否要将导航属性从主体公开给依赖项,和/或以其他方式公开。

假设您想将ClientAdmin标记为主体,因此School将成为从属,并且会有一个从ClientAdminSchool的导航属性,然后反之亦然。在这种情况下,作为您的目标,主体实体的主键也将成为从属实体的主键。

为此,您必须在 POCO 上声明这些属性,并配置实体类型配置类以创建关系。

可以完成以下设置:

  

将导航属性添加到主体实体。

public class ClientAdmin
{
    ...

    public School School { get; set; }
}
  

将导航属性添加到从属实体。

public class School
{
    ...

    public ClientAdmin ClientAdmin { get; set; }
}
  

在您的一个实体映射器上设置实体类型配置。下面设置了附属实体-学校:

public class SchoolMapper : EntityTypeConfiguration<School>
{
    public SchoolMapper()
    {
        //your other mapping config.

        //add the one-to-one mapping.

        HasRequired(x => x.ClientAdmin)
            .WithRequiredDependent(x => x.School)
            .WillCascadeOnDelete(true);
    }
}

这应该为您提供ClientAdminSchool实体之间的理想关系。让我知道它如何为您工作。

希望这会有所帮助!