Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架父-子-子多次引用父_C#_Entity Framework 5_Parent Child - Fatal编程技术网

C# 实体框架父-子-子多次引用父

C# 实体框架父-子-子多次引用父,c#,entity-framework-5,parent-child,C#,Entity Framework 5,Parent Child,我有一个EF5的情况和一个复杂的对象。最基本的是,我有一个父到子的复杂对象,但子对象多次引用父对象。我尝试了各种选择,但没有找到解决问题的办法。我得到的最接近的是(选项2c) 我的模型如下所示: public class StaffMember { public virtual Guid StafId { get; set; } // other props // List of leave apps (Approved/Cancelled etc) public vi

我有一个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; }
}
业务规则规定:一名员工有“许多”休假申请,而一份休假申请属于一名员工。每项申请在“批准”之前都需要2名工作人员(经理)的批准

我如何使用EF映射上述内容,以便单个员工有“多个”休假申请(已在工作),并且休假申请映射回第一次批准、第二次批准的员工。如果我只对“ApprovedBy1”使用一个映射,那么EF很高兴,并且所有的工作都如预期的那样。当我添加第二个approval mapping时,EF将处理它生成的SQL查询

我不知道如何告诉EF映射回StaffMembers表,以指定谁在级别1批准了申请,谁在级别2批准了申请。这几乎是一种多对多的关系

有什么想法吗?

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

  • 数据批注:
  • 流畅映射
由于您已经有了fluent mapping,我将向您展示如何在那里进行此操作:

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

具有可选的(…)。WithMany(…)
对是映射反向属性的一种方法。来自另一端的您可以使用,例如,
HasMany(…)。使用可选(…)

谢谢您的回复。我已经试过了,但问题仍然存在,最初的映射(ApprovedBy1)指的是申请休假的实际工作人员。他们不能批准自己的。这里基本上涉及3名员工:1)请求休假的实际人员[员工表(父)-字段:StaffID=休假表(子)-字段:StaffID]2)批准休假的第一位“经理”[休假表(父)-字段:ApprovedBy1=员工表(子)-字段:StaffID],3)批准休假的第二位经理[休假表(父)-字段:ApprovedBy2=员工表(子)-字段:StaffID]我不确定您在这里描述的是业务逻辑还是映射问题。也许你应该把它添加到你的问题中,让它更清楚。嗨,格特,我更新了问题的下半部分,试图把它弄清楚一点。本质上,它是一个业务规则,需要存储在数据库中,因此它跨两个域登录。我需要知道是谁先批准的,是谁第二个批准的,但在一天结束时,每个涉及的“人员”都存储在同一个表中,并链接到子“请假申请”表下。如果我很了解你,你需要第三个映射,除了你的“//子关系”将StaffId与LeaveApps关联且业务规则为
StaffId!=离开批准人1!=离开ApprovedBy 2
。这有意义吗?
  StaffID uniqueidentifier (FK - tblStaffMembers)
  LeaveID uniqueidentifier (PK)
  LeaveApprovedBy1 uniqueidentifier (FK - tblStaffMembers)
  LeaveApprovedBy2 uniqueidentifier (FK - tblStaffMembers)
HasOptional(x => x.ApprovedBy1).WithMany(x => x.LeaveApps)
                               .HasForeignKey(s => s.StaffId);
HasOptional(x => x.ApprovedBy2).WithMany()
                               .Map(m => m.MapKey("LeaveApprovedBy2"));