lin*_*use 22 .net c# associations entity-framework-4
"必须使用关系流畅的API或数据注释显式配置此关联的主要结尾."
我在更新/迁移数据库时在实体框架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; }
}
Run Code Online (Sandbox Code Playgroud)
其中EntityA必须具有EntityB父级,而EntityB可以具有首选的EntityA子级,但不必具有.首选子项应该是与父项关联的子项之一,但我不知道如何在数据库中强制执行此操作.我打算以编程方式强制执行它.
如何解决此错误或实现这些关系的更好方法是什么?
Sla*_*uma 34
实体框架代码 - 第一约定假定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);
Run Code Online (Sandbox Code Playgroud)
(如果使用此选项,则可以删除[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; }
}
Run Code Online (Sandbox Code Playgroud)