首先,这在EF6中有效,但是我似乎无法在OData EF Core中使其正常工作。在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进行自我联接,以提供Parent,Grand Parent,Great Grand Parent等,这样通过该视图显示的底层站点记录就可以显示出来其区域,楼层,建筑物和设施导致以下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; }
}
我已将Navigation属性(FSFacility,FSBuilding等)归因于其ForeignKey列。
由于我使用的是OData EF Core,因此它具有自己的ODataModelBuilder,它很简单
builder.EntityType<FacilityStructure>().HasKey(e => e.Id);
DbContext的OnModelCreating中的
和ModelBuilder与映射到正确的View相似
builder.Entity<FacilityStructure>(entity =>
{
entity.HasKey(e => e.Id);
entity.ToTable("FacilityStructure", "odata");
});
但是当我查询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'."
因此它抱怨无法解决FSFacility的关系,我应该手动配置它,我想我是通过[ForeignKey()]属性来完成的。奇怪的是,如果我注释掉3个关系(FSFloor,FSZone,FSSite),则它起作用了,我得到了数据,并且可以在$ FSFacility,FSBuilding上有效地扩展。一旦我添加了第三个关系,错误就会返回。
在我看来,这在EF Core中似乎是一个错误,因为我明确定义了0:1关系,并且如果定义了2,但对于3个或更多,则无效。
我现在意识到,也许应该针对每个StructureType将单个自引用表拆分为多个表,但是实际上是几年前做出的决定,现在我将.NET Framework单片Webapp移植到.NET Core和Microservice体系结构,但是需要整体式Webapp继续工作 任何帮助表示赞赏