EF:配置多对多关系(代码优先)

时间:2015-06-22 19:41:47

标签: entity-framework

在我的情景中,我有工作,公司和部门。

单一工作可能只有一家公司;公司可能有多个职位(一对多)

单个工作可能有多个部门;部门可能有多个工作(多对多)。

我想仅使用外键设置关系。为此,我有外键和懒惰导航属性的属性。

这些是我的课程:

public class JobEntity
{
    [Key]
    public int Id
    {
        get;
        set;
    }

    public Companies CompanyId
    {
        get;
        set;
    }

    //Navigation
    [ForeignKey("CompanyId")]
    public virtual CompanyEntity Company
    {
        get;
        set;
    }

    public IList<Departments> Departments
    {
        get;
        set;
    }       

    //navigation
    public virtual IList<DepartmentEntity> DepartmentsNavigation
    {
        get;
        set;
    }
}


public class DepartmentEntity
{
    public Departments Id
    {
        get;
        set;
    }

    public string Name
    {
        get;
        set;
    }

    //navigation
    public virtual IList<JobEntity> Jobs
    {
        get;
        set;
    }
}


public class CompanyEntity
{
    public Companies Id
    {
        get;
        set;
    }

    public string Name
    {
        get;
        set;
    }

    //navigation
    public virtual List<JobEntity> Jobs
    {
        get;
        set;
    }
}

另外,我在上下文中有多对多的映射:

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

        modelBuilder.Entity<JobEntity>()
                    .HasMany<DepartmentEntity>(s => s.DepartmentsNavigation)
                    .WithMany(c => c.JobsNavigation)
                    .Map(cs =>
                    {
                        cs.MapLeftKey("JobId");
                        cs.MapRightKey("DepartmentId");
                        cs.ToTable("JobsDepartments");
                    });

    }

当我将CompanyId设置为Job时,一切都按预期工作:当我从DB获取Job时,我有一个关联的公司延迟加载。

但是,当我设置相关外键的作业列表时(&#39;部门&#39;) - 当我从DB加载作业时,此列表为空并且部门导航属性(&#39; DepartmentsNavigation&#39;)数量为0(我预计会设置部门ID的集合,我设置了懒惰的部门集合)。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

对于多对多,您不能使用外键关联。

引用了这个here

  

EFv4中的一对一关系始终使用外键关联,多对多关系始终使用独立关联。

here

  

注意:在多对多(*:*)中,您无法向实体添加外键。在*:*关系中,关联信息由独立对象管理。

here

  

但是,如果您具有由仅包含外键的连接表连接的纯多对多关系,则EF将使用独立关联来管理此多对多关系。

您的外键已经在JobsDepartments表中,因此EF不允许您在JobEntityDepartmentEntity实体中为该关系添加其他外键。