2013-09-27 88 views
0

我有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

您正在查看反相屬性,這是屬於關聯另一端的屬性。在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(...)

+0

感謝您的回覆。我已經嘗試過,但問題依然存在,最初的映射(ApprovedBy1)指向申請請假的實際工作人員。他們不能批准他們自己的。 – QuentinInSA

+0

本質上有3名工作人員在這裏參與:1)實際請假人員[職員表(父) - 領域:職員ID =離職表(子) - 領域:職員ID] 2)批准休假的第一個「經理」離開表格(父) - 字段:ApprovedBy1 =員工表(子) - 字段:職員ID],3)第二個經理批准離職[離開表格(父) - 字段:ApprovedBy2 =員工表格(子) - 字段: ] – QuentinInSA

+0

我不確定您是在描述業務邏輯還是映射問題。也許你應該把它添加到你的問題中,以使其更清楚。 –