必须使用关系流畅API或数据注释显式配置此关联的主要结尾

“必须使用关系流畅的API或数据注释显式配置此关联的主要结尾。”

我在更新/迁移数据库时在entity framework4.4中收到此错误,但我不是要尝试指定1:1关系。 我想要这样的东西:

public class EntityA { public int ID { get; set; } public int EntityBID { get; set; } [ForeignKey("EntityBID")] public virtual EntityB EntityB { get; set; } } public class EntityB { public int ID { get; set; } public Nullable PreferredEntityAID { get; set; } [ForeignKey("PreferredEntityAID")] public virtual EntityA PreferredEntityA { get; set; } } 

其中EntityA必须具有EntityB父级,而EntityB可以具有首选的EntityA子级,但不必具有。 首选子项应该是与父项关联的子项之一,但我不知道如何在数据库中强制执行此操作。 我打算以编程方式强制执行它。

如何解决此错误或实现这些关系的更好方法是什么?

entity framework代码优先约定假定EntityA.EntityBEntityB.PreferredEntityA属于相同的关系,并且是彼此的反向导航属性。 因为两个导航属性都是引用(而不是集合),所以EF推断出一对一的关系。

由于您实际上需要两个一对多关系,因此必须覆盖约定。 使用您的模型,只能使用Fluent API:

 modelBuilder.Entity() .HasRequired(a => a.EntityB) .WithMany() .HasForeignKey(a => a.EntityBID); modelBuilder.Entity() .HasOptional(b => b.PreferredEntityA) .WithMany() .HasForeignKey(b => b.PreferredEntityAID); 

(如果使用此选项,则可以删除[ForeignKey]属性。)

您无法指定一个映射,以确保首选子节点始终是关联子节点之一。

如果您不想使用Fluent API但只想使用数据注释,则可以在EntityB添加集合属性,并使用[InverseProperty]属性将其与EntityA.EntityB相关联:

 public class EntityB { public int ID { get; set; } public Nullable PreferredEntityAID { get; set; } [ForeignKey("PreferredEntityAID")] public virtual EntityA PreferredEntityA { get; set; } [InverseProperty("EntityB")] // <- Navigation property name in EntityA public virtual ICollection EntityAs { get; set; } }