“必须使用关系流畅的 API 或数据注释显式配置此关联的主体端。”
更新/迁移数据库时,我在 Entity Framework 4.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<int> PreferredEntityAID { get; set; }
[ForeignKey("PreferredEntityAID")]
public virtual EntityA PreferredEntityA { get; set; }
}
其中 EntityA 必须有一个 EntityB 父级,而 EntityB 可以有一个首选的 EntityA 子级,但不是必须的。首选 child 应该是与 parent 关联的 child 之一,但我不知道如何在数据库中强制执行此操作。我计划以编程方式执行它。
我该如何解决这个错误,或者什么是建立这些关系的更好方法?
最佳答案
Entity Framework Code-First 约定假设 EntityA.EntityB
和 EntityB.PreferredEntityA
属于同一关系并且是彼此的反向导航属性。因为两个导航属性都是引用(而不是集合),所以 EF 推断出一对一的关系。
由于您实际上需要两个一对多关系,因此您必须覆盖约定。对于您的模型,只有 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);
(如果您使用它,您可以删除 [ForeignKey]
属性。)
您不能指定一个映射来确保首选子项始终是关联子项之一。
如果您不想使用 Fluent API 而只想使用数据注释,您可以在 EntityB
中添加一个集合属性,并使用 将其关联到
属性:EntityA.EntityB
>[InverseProperty]
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; }
}
关于c# - 必须使用关系流畅的 API 或数据注释显式配置此关联的主体端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17254724/