Sql OData EF核心多重自参考表

Sql OData EF核心多重自参考表,sql,view,odata,ef-core-2.2,Sql,View,Odata,Ef Core 2.2,首先,这是在EF6工作,但我似乎不能让它在OData EF核心工作。在EF6中,我使用的是VisualStudio的.edmx设计器 我有一个名为FacilityStructure的表,它表示一个层次结构 Facility Building Floor Zone Site 也就是说,一个设施可以有0个或多个建筑物,一个建筑物可以有0个或多个楼层等 SQL表基本上是 Id PK INT NOT NULL StructureType INT NOT NUL

首先,这是在EF6工作,但我似乎不能让它在OData EF核心工作。在EF6中,我使用的是VisualStudio的.edmx设计器

我有一个名为FacilityStructure的表,它表示一个层次结构

Facility 
  Building
    Floor
      Zone
        Site
也就是说,一个设施可以有0个或多个建筑物,一个建筑物可以有0个或多个楼层等

SQL表基本上是

Id PK INT NOT NULL
StructureType INT NOT NULL (0 = Facility, 1 = Building etc)
ParentId INT NULL
Name NVARCHAR(255) NOT NULL
该表通过ParentId进行自引用,工作正常-我还有一个SQL视图,它基本上对每个StructureType进行自连接,以提供父级、父级、父级等,这样通过该视图的底层站点记录显示其区域、楼层、建筑和设施,从而产生以下POCO

public partial class FacilityStructure
{
    public int Id { get; set; }
    public int StructureType { get; set; }
    public Nullable<int> ParentId { get; set; }
    public string Name { get; set; }
    public Nullable<int> FSFacilityId { get; set; }
    public Nullable<int> FSBuildingId { get; set; }
    public Nullable<int> FSFloorId { get; set; }
    public Nullable<int> FSZoneId { get; set; }
    public Nullable<int> FSSiteId { get; set; }

    [ForeignKey(nameof(FSFacilityId))]
    public virtual FacilityStructure FSFacility { get; set; }

    [ForeignKey(nameof(FSBuildingId))]
    public virtual FacilityStructure FSBuilding { get; set; }

    [ForeignKey(nameof(FSFloorId))]
    public virtual FacilityStructure FSFloor { get; set; }

    [ForeignKey(nameof(FSZoneId))]
    public virtual FacilityStructure FSZone { get; set; }

    [ForeignKey(nameof(FSSiteId))]
    public virtual FacilityStructure FSSite { get; set; }
}
因此,它抱怨无法计算FSFacility的关系,我应该手动配置它,我想我是通过[ForeignKey()]属性来实现的。奇怪的是,如果我对其中的3种关系(FSFloor、FSZone、FSSite)进行注释,那么它就可以工作了,我可以获得数据,我可以在FSFacility、FSBuilding上扩展$。一旦我添加了第三个关系,错误就会返回

对我来说,这似乎是EF Core中的一个bug,因为我显式地定义了0:1关系,如果定义了2,但不定义3或更多,它就会工作

我现在意识到,我可能应该将单个自引用表拆分为每个结构类型的表,但这一决定实际上是多年前做出的,我现在正在将.NET Framework单片Webapp移植到.NET Core和Microservice架构,但需要单片Webapp继续工作
非常感谢任何帮助

我最终通过为FSFacility…FSSite和setup添加POCO类来避免递归关系,实现了这一点
builder.EntityType<FacilityStructure>().HasKey(e => e.Id);
builder.Entity<FacilityStructure>(entity =>
{
    entity.HasKey(e => e.Id);
    entity.ToTable("FacilityStructure", "odata");
});
[EnableQuery]
public IQueryable<FacilityStructure> GetFacilityStructures()
{
    return db.FacilityStructures;
}
The query specified in the URI is not valid. 
Unable to determine the relationship represented by navigation 
property 'FacilityStructure.FSFacility' of type 'FacilityStructure'. 
Either manually configure the relationship, or ignore this property 
using the '[NotMapped]' attribute or by using 
'EntityTypeBuilder.Ignore' in 'OnModelCreating'."