我遇到了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级批准了它。它几乎最终成为多对多关系。
有什么想法吗?
答案 0 :(得分:0)
您正在寻找逆属性,它是关联另一端的属性。在EF中,有两种方法可以将属性标记为反向。
InversePropertyAttribute
。由于你已经有了流畅的映射,我会告诉你如何在那里做到:
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(...)
。