Entity Framework 中存在多个自引用关系

7

我目前有一个名为EmployeeDetails的类,如下所示。

public class EmployeeDetails {

    public int EmployeeDetailsId { get; set; }
    public string Name { get; set; }
    public string Title { get; set; }

    [ForeignKey("Manager")]
    public int? ManagerId { get; set; }
    public virtual EmployeeDetails Manager { get; set; }
    [ForeignKey("LineManager")]
    public int? LineManagerId { get; set; }
    public virtual EmployeeDetails LineManager { get; set; }

}

我试图添加一个Manager和LineManager属性,它们将引用相同类型的对象。当我尝试添加迁移时,出现以下错误: 无法确定EmployeeDetails和EmployeeDetails之间关联的主端。 在添加ManagerId、LineManagerId和LineManager属性之前,Manager属性按预期工作。 如何解决这个问题?

你的映射文件是什么样子的?在LineManagerId列上添加了外键吗? - Herman Cordes
目前我在类上没有任何额外的映射属性。 - James
你需要使用属性或流畅映射来映射你的外键,你的命名约定不能遵循EF可以用来解决问题的约定。 - Ben Robinson
我刚刚按照我的编辑添加了外键属性,但是出现了以下错误:EmployeeDetails_Manager_Target: : 在关系“EmployeeDetails_Manager”中,角色“EmployeeDetails_Manager_Target”的多重性无效。因为从属角色属性不是关键属性,所以从属角色的上限多重性必须为“*”。 - James
您目前的外键关系是一对一,请将其更改为一对多。 - g williams
https://dev59.com/0F8d5IYBdhLWcg3w1FB0 - g williams
1个回答

4

您需要指定关系的另一侧,像这样:

public class EmployeeDetails
{

    public int EmployeeDetailsId { get; set; }
    public string Name { get; set; }
    public string Title { get; set; }

    [ForeignKey("Manager")]
    public int? ManagerId { get; set; }

    public virtual EmployeeDetails Manager { get; set; }

    [ForeignKey("LineManager")]
    public int? LineManagerId { get; set; }

    public virtual EmployeeDetails LineManager { get; set; }

    [ForeignKey("ManagerId")]
    public virtual ICollection<EmployeeDetails> ManagedEmployees { get; set; }

    [ForeignKey("LineManagerId")]
    public virtual ICollection<EmployeeDetails> LineManagedEmployees { get; set; }

}

生成迁移文件

CreateTable(
    "dbo.EmployeeDetails",
    c => new
        {
            EmployeeDetailsId = c.Int(nullable: false, identity: true),
            Name = c.String(),
            Title = c.String(),
            ManagerId = c.Int(),
            LineManagerId = c.Int(),
        })
    .PrimaryKey(t => t.EmployeeDetailsId)
    .ForeignKey("dbo.EmployeeDetails", t => t.LineManagerId)
    .ForeignKey("dbo.EmployeeDetails", t => t.ManagerId)
    .Index(t => t.ManagerId)
    .Index(t => t.LineManagerId);

这解决了你的问题吗?

这确实解决了我的问题。是否有任何参考资料可以说明EF如何确定这些关系?我很想知道为什么这会使关系对EF更清晰。 - James
这里有官方的EF文档页面https://msdn.microsoft.com/en-us/data/ee712907.aspx#apidocs。然而,说实话,文档太简短了,很多功能都没有提到。 - Fabio Luz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接