我对实体框架有一个问题,我无法弄清楚。
我有一个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 :一个表有两个外键到同一个表。一个外键被正确处理而另一个没有。
答案 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();