Entity Framework Code-First conventions are assuming that EntityA.EntityB
and EntityB.PreferredEntityA
belong to the same relationship and are the inverse navigation properties of each other. Because both navigation properties are references (not collections) EF infers a one-to-one relationship.
Since you actually want two one-to-many relationships you must override the conventions. With your model it's only possible with Fluent API:
modelBuilder.Entity<EntityA>()
.HasRequired(a => a.EntityB)
.WithMany()
.HasForeignKey(a => a.EntityBID);
modelBuilder.Entity<EntityB>()
.HasOptional(b => b.PreferredEntityA)
.WithMany()
.HasForeignKey(b => b.PreferredEntityAID);
(If you use this you can remove the [ForeignKey]
attributes.)
You cannot specify a mapping that would ensure that the preferred child is always one of the associated childs.
If you don't want to use Fluent API but only data annotations you can add a collection property in EntityB
and relate it to EntityA.EntityB
using the [InverseProperty]
attribute:
public class EntityB
{
public int ID { get; set; }
public Nullable<int> PreferredEntityAID { get; set; }
[ForeignKey("PreferredEntityAID")]
public virtual EntityA PreferredEntityA { get; set; }
[InverseProperty("EntityB")] // <- Navigation property name in EntityA
public virtual ICollection<EntityA> EntityAs { get; set; }
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…