2 回答
TA贡献2039条经验 获得超7个赞
在 EF Core 中,每个关系都包含 0、1 或 2 个导航属性。在大多数情况下,EF Core 可以自动确定关系及其关联的导航属性。但有时它不能,所以它会抛出异常,并希望您通过数据注释、流式 API 或两者的组合来明确指定。
在这种特殊情况下,异常消息告诉您 EF Core 无法确定EntityChildren.TransformedParents集合导航属性表示的关系。您可以通过使用[InverseProperty]数据注释将其与ParentEntity.TransformationEntity参考导航属性配对来解决它:
[InverseProperty(nameof(EntityParent.TransformationEntity))]
public virtual ICollection<EntityParent> TransformedParents { get; set; }
在这种特殊情况下,这应该足够了。
Fluent API 更加灵活,因为它们允许完全配置关系的所有方面 - 主体、依赖、导航属性、依赖 FK 属性、主体 PK 属性、必需/可选、级联删除行为等。相应的 fluent 配置如下:
modelBuilder.Entity<EntityParent>()
.HasOne(p => p.TransformationEntity)
.WithMany(c => c.TransformedParents)
.HasForeignKey(p => p.TransformationEntityId) // optional (by convention)
.IsRequired(false) // optional (by convention)
.OnDelete(DeleteBehavior.ClientSetNull) // optional (by convention)
;
TA贡献1835条经验 获得超7个赞
public class EntityChildren
{
public virtual ICollection<EntityParent> TransformedParents { get; set; }
和
public class EntityParent
{
public virtual ICollection<EntityChildren> Childrens { get; set; }
创建 EF Core 不支持的多对多关系。
必须有一个中间班来解决这个问题
比如一个类中间类 ParentChildren
public class ParentChildren
{
public int ParentId { get; set; }
public EntityParent Parent{ get; set; }
public int ChildId { get; set; }
public EntityChild Child{ get; set; }
}
然后,ICollection<ParentChildren>在你的EntityParent和EntityChild
数据库上下文
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<EntityParent>()
.HasKey(x => x.Id);
modelBuilder.Entity<EntityChild>()
.HasKey(x => x.Id);
modelBuilder.Entity<ParentChildren>()
.HasKey(x => new { x.ParentId , x.ChildId });
modelBuilder.Entity<ParentChildren>()
.HasOne(x => x.Parent)
.WithMany(m => m.Childrens)
.HasForeignKey(x => x.ParentId);
modelBuilder.Entity<ParentChildren>()
.HasOne(x => x.Child)
.WithMany(e => e.TransformedParents)
.HasForeignKey(x => x.ChildId);
}
- 2 回答
- 0 关注
- 173 浏览
添加回答
举报