3

我一直在這個小時,並嘗試了很多建議,我發現搜索,但沒有運氣。我使用的代碼第一個EF 5.如何將一個代碼第一個對象中的兩個屬性映射到相同的父類型

情況是,我有一個班員工。然後我有另一個有兩個屬性的類,它們都是Employee類型。我希望這些都是外鍵約束,但是這些要求允許來自和來自相同用戶的許多相同請求,所以我不能將它們用作鍵。我真的不在乎員工擁有兩個導航集合,但是在我看來是一個需求的問題上工作。如果它簡化了問題,我可以刪除這些問題。

我收到此消息。 System.Data.Entity.Edm.EdmAssociationEnd :: Multiplicity在關係'Employee_RequestsForEmployee'的關係'Employee_RequestsForEmployee_Target'中無效。因爲「依賴角色」屬性不是關鍵屬性,所以「依賴角色」的多重性的上界必須爲「*」。

我已經嘗試過在上下文的OnModelCreation方法中使用Fluent API;

modelBuilder.Entity() .HasRequired(U => u.ForEmployee) .WithMany() .HasForeignKey(U => u.ForEmployeeId);

 modelBuilder.Entity<RevenueTransferRequest>() 
        .HasRequired(u => u.FromEmployee) 
        .WithMany() 
        .HasForeignKey(u => u.FromEmployeeId); 

在衝突中的類(我已經刪除了清晰一些性質);

public class Employee : IEmployee 
    { 
     [Key] 
     public string Id { get; set; } 

     [InverseProperty("ForEmployee")] 
     public ICollection<RevenueTransferRequest> RequestsForEmployee { get; set; } 

     [InverseProperty("FromEmployee")] 
     public ICollection<RevenueTransferRequest> RequestsFromEmployee { get; set; } 
    } 

public class RevenueTransferRequest : IRevenueTransferRequest 
    { 
     [Key] 
     public Guid Id { get; set; } 

     [Required] 
     [ForeignKey("ForEmployee")] 
     public String ForEmployeeId { get; set; } 

     [InverseProperty("RequestsForEmployee")] 
     public Employee ForEmployee { get; set; } 

     [Required] 
     [ForeignKey("FromEmployee")] 
     public String FromEmployeeId { get; set; } 

     [InverseProperty("RequestsFromEmployee")] 
     public Employee FromEmployee { get; set; } 
    } 

任何幫助將不勝感激。提前致謝。

+0

有趣的問題。從'Employee'派生一個'RevenueTransferRequestFromEmployee'會不會過分?在這裏大聲思索...只需指出,如果它位於名爲'[typename] Id'或'Id'的屬性的頂部,則不需要'[Key]'屬性,因爲實體框架通過找到關鍵字*約定優於配置*。 – 2013-02-14 03:01:54

+0

最後,我刪除了所有InverseProperty和ForiegnKey定義,並將集合從Employee表中取出。它的工作原理和鑰匙在那裏。這讓我在這個項目上前進。我將在業餘時間繼續研究這個問題,當我找到答案時我會回來找解決方案。 – 2013-02-15 15:43:12

回答

3

我從來沒有弄清楚如何使用數據註釋來做到這一點,但使用Fluent API我能夠做到這一點。我錯過的是,我必須在HasMany()方法中指定另一方面的關係是通過數據註釋和約定理解的。

這在DbContext OnModelCreating覆蓋中調用(WillCascadeOnDelete(false)與另一個問題有關)。

modelBuilder.Entity<RevenueTransferRequest>() 
       .HasRequired(e => e.FromEmployee) 
       .WithMany(x=>x.RequestsFromEmployee) 
       .WillCascadeOnDelete(false); 

    modelBuilder.Entity<RevenueTransferRequest>() 
       .HasRequired(e => e.ForEmployee) 
       .WithMany(x => x.RequestsForEmployee) 
       .WillCascadeOnDelete(false); 

隨着等級:

[Key] 
     public String Id { get; set; } 

     public String BusinessUnitLeaderId { get; set; } 

     public Employee BusinessUnitLeader { get; set; } 

     [Required] 
     [MaxLength(150)] 
     public String DisplayName { get; set; } 

     public ICollection<Project> BusinessUnitLeaderProjects { get; set; } 

     public ICollection<RevenueTransferRequest> RequestsForEmployee { get; set; } 

     public ICollection<RevenueTransferRequest> RequestsFromEmployee { get; set; } 

public class RevenueTransferRequest 
    { 
     [Key] 
     public Guid Id { get; set; } 

     [Required] 
     public String ForEmployeeId { get; set; } 

     public Employee ForEmployee { get; set; } 

     [Required] 
     public String FromEmployeeId { get; set; } 

     public Employee FromEmployee { get; set; } 

     [Required] 
     public String ProjectId { get; set; } 

     public Project Project { get; set; } 

     [Required] 
     public Double? TransferAmount { get; set; } 

     public int WorkflowState { get; set; } 
    } 
相關問題