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; } 
    } 
相关问题