0

我遇到了 EF5 和复杂对象的情况。基础是我有一个父子复杂对象,但子对象不止一次引用父对象。我尝试了各种选择,但没有找到可以回答问题的解决方案。我得到的最接近的是这个答案(选项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 批准了它。它几乎最终成为多对多关系。

有任何想法吗?

4

1 回答 1

0

您正在寻找inverse property,它是关联另一端的属性。在 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(...).

于 2013-09-27T20:07:09.283 回答