实体框架父子项 - 子项不止一次地指父项

时间:2013-09-27 14:25:47

标签: c# entity-framework-5 parent-child

我遇到了EF5和复杂对象的情况。基础是我有一个父对子复杂对象,但是孩子不止一次地回到父对象。我尝试了各种选项,但没有找到解决问题的解决方案。我最接近的是this answer(选项2c)

我的模型如下所示:

public class StaffMember
{
   public virtual Guid StafId { get; set; }
   // other props

   // List of leave apps (Approved/Cancelled etc)
   public virtual ICollection<StaffLeaveApp> LeaveApps { get; set; }
}

//Staff Leave Application
public class StaffLeaveApp
{
   public virtual Guid LeaveId { get; set; }
   public virtual Guid StaffId { get; set; }
   // other props...

   // Leave approved by? (2 approvals required)
   public virtual StaffMember ApprovedBy1 { get; set; }
   public virtual StaffMember ApprovedBy2 { get; set; }
}

我的映射看起来像这样

public class StaffMap : EntityTypeConfiguration<StaffMember>
{
    public StaffMap()
    {
        ToTable("tblStaffMembers");
        HasKey(x => x.StaffId);
        // other mappings...

        HasMany(x => x.LeaveApps);
    }
}

public class StaffLeaveAppMap: EntityTypeConfiguration<StaffLeaveApp>
{
    public StaffLeaveAppMap()
    {
        ToTable("tblStaffMembersLeaveApps");
        HasKey(x => x.LeaveId);
        Property(x => x.StaffId).HasColumnName("StaffID");

        //Child Relationships
        HasOptional(x => x.ApprovedBy1).WithMany().Map(m => m.MapKey("LeaveApprovedBy1"));
        HasOptional(x => x.ApprovedBy2).WithMany().Map(m => m.MapKey("LeaveApprovedBy2"));
    }
}

表(对不起,没有图片)

  StaffID uniqueidentifier (FK - tblStaffMembers)
  LeaveID uniqueidentifier (PK)
  LeaveApprovedBy1 uniqueidentifier (FK - tblStaffMembers)
  LeaveApprovedBy2 uniqueidentifier (FK - tblStaffMembers)

业务规则说:工作人员有“许多”请假申请,而请假申请属于一名工作人员。每份申请都需要得到2名工作人员(经理)的批准才能获得“批准”。

我如何使用EF映射上述内容,以便单个工作人员有一个“许多”请假申请(已经工作),并且请假申请被映射回批准第一次批准的工作人员,然后再申请批准。如果我使用“ApprovedBy1”的一个映射,那么EF很高兴并且所有工作都按预期工作。我添加第二个批准映射EF的那一刻与它生成的SQL查询斗争。

我不知道如何告诉EF回到StaffMembers表,以指定谁在第1级批准了申请,谁在第2级批准了它。它几乎最终成为多对多关系。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您正在寻找逆属性,它是关联另一端的属性。在EF中,有两种方法可以将属性标记为反向。

由于你已经有了流畅的映射,我会告诉你如何在那里做到:

HasOptional(x => x.ApprovedBy1).WithMany(x => x.LeaveApps)
                               .HasForeignKey(s => s.StaffId);
HasOptional(x => x.ApprovedBy2).WithMany()
                               .Map(m => m.MapKey("LeaveApprovedBy2"));

HasOptional(...).WithMany(...)对是映射逆属性的一种方法。来自另一方,您可以使用例如HasMany(....).WithOptional(...)