【问题标题】:Multiple self-referencing relationships in Entity Framework实体框架中的多个自引用关系
【发布时间】:2015-09-17 11:13:33
【问题描述】:

我目前有一个名为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; }

}

我正在尝试添加 ManagerLineManager 属性,它们将引用相同类型的对象。 当我尝试添加迁移时,出现以下错误:

无法确定 EmployeeDetailsEmployeeDetails 类型之间关联的主体端。

在添加 ManagerId、LineManagerId 和 LineManager 属性之前,Manager 属性按预期工作。

我该如何解决?

【问题讨论】:

  • 您的映射看起来如何?您是否在 LineManagerId 列上添加了外键?
  • 目前我的类上没有任何额外的映射属性。
  • 您需要使用属性或流畅的映射来映射您的外键,您的命名约定不会也不能遵循 EF 可以用来解决它的约定。
  • 我刚刚添加了外键属性,如我的编辑中所示,并收到以下错误:EmployeeDetails_Manager_Target: : Multiplicity is not valid in Role 'EmployeeDetails_Manager_Target' in relationship 'EmployeeDetails_Manager'。因为从属角色属性不是关键属性,所以从属角色的多重性的上限必须是“*”。
  • 你目前在fk关系上是1:1改成一对多

标签: c# .net asp.net-mvc entity-framework


【解决方案1】:

您必须指定关系的另一方。像这样:

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 的关系更加清晰。
  • 有官方的EF文档页面msdn.microsoft.com/en-us/data/ee712907.aspx#apidocs但是,说实话,文档太短了,很多功能都没有提到。
猜你喜欢
  • 1970-01-01
  • 2012-04-14
  • 1970-01-01
  • 2012-02-13
  • 1970-01-01
  • 2011-07-04
  • 1970-01-01
相关资源
最近更新 更多