EF6:2x一对一关系给出错误“无法确定主要关联结束”

时间:2017-10-05 10:05:43

标签: c# entity-framework

我对实体框架有一个问题,我无法弄清楚。

我有一个Module类,它以两种方式链接到另一个Module(一对一的关系)。

代码:

public class Module {
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id {get;set;} /* primary key */
    public Guid? OtherModule1 {get;set;}
    [ForeignKey("OtherModule1")]
    public Module OtherModule {get;set;}

    public Guid? OtherModule2 {get;set;}
    [ForeignKey("OtherModule2")]
    public Module OtherModule2 {get;set;}
}

这给出了无法确定关联的主要结尾的错误。

Unable to determine the principal end of an association between the types 'Module' and 'Module'

我理解错误意味着什么,但这就是事情。与OtherModule1的关系始终存在而没有问题。此代码有效:

public class Module {
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id {get;set;} /* primary key */
    public Guid? OtherModule1 {get;set;}
    [ForeignKey("OtherModule1")]
    public Module OtherModule {get;set;}
}

此表中没有Fluent配置 现在,如果我添加一个新列OtherModule2并以完全相同的方式链接它,则会弹出此错误。 有没有人知道如何处理这个?

TL / DR :一个表有两个外键到同一个表。一个外键被正确处理而另一个没有。

1 个答案:

答案 0 :(得分:1)

按惯例,工作模型定义了一对多单向(在多方面只有导航属性)关系。它相当于以下流畅的配置:

modelBuilder.Entity<Module>()
    .HasOptional(e => e.OtherModule)
    .WithMany()
    .HasForeignKey(e => e.OtherModule1);

当您添加第二个FK /导航属性对时(我已经重命名了FK属性,因为您在类中没有2个具有相同名称的属性):

public class Module
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; } /* primary key */

    public Guid? OtherModule1 { get; set; }
    [ForeignKey("OtherModule1")]
    public Module OtherModule { get; set; }

    [Column("OtherModule2")]
    public Guid? OtherModule2_Id { get; set; }
    [ForeignKey("OtherModule2_Id")]
    public Module OtherModule2 { get; set; }
}

EF无法自动确定关系 - 它可能是2个单向一对多或1个双向一对一,因此错误。

在这种情况下,无法使用数据注释指定,​​因此您需要使用流畅配置来完全配置关系,或者与数据注释结合使用时,只需指定基数和所涉及的导航属性。 / p>

以下流畅的配置足以解决上述数据注释模型的问题:

modelBuilder.Entity<Module>()
    .HasOptional(e => e.OtherModule)
    .WithMany();

modelBuilder.Entity<Module>()
    .HasOptional(e => e.OtherModule2)
    .WithMany();