[英]EF Core one-way self referencing entity binding
我已经使用EF Core建立了一个自我参照实体,如下所示:
实体
public class DetailType
{
public int DetailTypeId { get; set; }
public string Name { get; set; }
public int? ParentTypeId { get; set; }
public DetailType ParentType { get; set; }
public IEnumerable<DetailType> ChildTypes { get; set; }
}
捆绑
modelBuilder.Entity<DetailType>()
.ToTable("detailtype")
.HasOne(x => x.ParentType)
.WithMany(x => x.ChildTypes)
.HasForeignKey(x => x.ParentTypeId);
我正在通过API检索这些实体,当前结果如下所示:
[
{
"detailTypeId": 20,
"name": "Money",
"parentTypeId": null,
"parentType": null,
"childTypes": null
},
{
"detailTypeId": 22,
"name": "Optional Extra",
"parentTypeId": null,
"parentType": null,
"childTypes": [
{
"detailTypeId": 42,
"name": "Extra Nights",
"parentTypeId": 22,
"childTypes": null
}
]
},
{
"detailTypeId": 42,
"name": "Extra Nights",
"parentTypeId": 22,
"parentType": {
"detailTypeId": 22,
"name": "Optional Extra",
"parentTypeId": null,
"parentType": null,
"childTypes": []
},
"childTypes": null
}
]
我的问题是数组中的第三项与第二项相反。 有没有一种方法可以避免这种情况,这样我就只有父级->子级关系,而不是父级->子级以及子级->父级。 上面的示例是我的API实际上返回的内容的简化版本,因此我想尽可能减少不必要的膨胀,因为会发生很多关系。
理想情况下,我想要的是摆脱ParentType属性,但仍然拥有ChildTypes集合,但是我不确定如何在模型构建器中定义它。
编辑:
我已删除不需要的流畅关系。 我也尝试了以下方法:
var roots = this.Items.Where(x => x.ParentTypeId == null);
foreach (var root in roots)
{
root.ChildTypes = this.Items.Where(x => x.ParentTypeId == root.DetailTypeId);
}
return roots.ToList();
( this.Items
一下, this.Items
是DbSet)
但是,这需要将ChildTypes
更改为IQueryable
并且当我这样做时,会收到以下异常:
实体类型“ DetailType”上的导航属性“ ChildTypes”的类型为“ EntityQueryable”,它不实现ICollection。 集合导航属性必须实现目标类型的ICollection <>。
首先,您无需在模型构建器中指定此关系。 它可以自行解决。
然后关于您的问题-我想到的第一件事(我不知道您的整个数据集)是获取所有具有ParentTypeId == null
的DetailType
对象。
这样,您将获得根源,然后递归构建子元素tree
。
这样做将清理您的结果,并且您将看到想要看到的结构。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.