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)

ビジネス ルールは次のように述べています。スタッフ メンバーは「多数の」休暇申請を持ち、休暇申請は 1 人のスタッフ メンバーに属します。各申請は、「承認」される前に 2 人のスタッフ (マネージャー) の承認が必要です。

EF を使用して上記をどのようにマッピングすれば、1 人のスタッフ メンバーが「多数の」休暇申請を持ち (既に作業中)、休暇申請が最初の承認のためにそれを承認したスタッフ メンバーにマップされ、次に 2 番目の承認のために再びマップされるようになります。 . 「ApprovedBy1」のみに1つのマッピングを使用すると、EFは満足し、すべてが期待どおりに機能します。2 番目の承認マッピングを追加した瞬間、EF はそれが生成する SQL クエリと格闘します。

レベル 1 で誰がアプリケーションを承認し、誰がレベル 2 でアプリケーションを承認したかを指定するために、EF を StaffMembers テーブルにマップし直すように指示する方法がわかりません。ほとんどの場合、多対多の関係になります。

何か案は?

4

1 に答える 1

0

関連のもう一方の端にあるプロパティである逆プロパティを探しています。EF では、プロパティを逆としてマークする方法が 2 つあります。

流暢なマッピングが既にあるので、そこでどのように行うかを示します。

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 に答える