OData EF Core таблица множественных ссылок - PullRequest
1 голос
/ 04 июля 2019

Прежде всего, это работало в EF6, но я не могу заставить его работать в OData EF Core.В EF6 я использовал .edmx конструктор VisualStudio

У меня есть одна таблица с именем 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, FSBuilding и т. д.) с их столбцами ForeignKey.

Поскольку я использую OData EF Core и у него есть собственный ODataModelBuilder, который просто

builder.EntityType<FacilityStructure>().HasKey(e => e.Id);

и ModelBuilder в OnModelCreating ofDbContext делает то же самое с отображением на правильный вид

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, который работает.Как только я добавляю 3-е отношение, ошибка возвращается.

Это кажется мне ошибкой в ​​EF Core, так как я явно определяю отношение 0: 1, и оно работает, если определены 2, но не для 3или более.

Теперь я понимаю, что мне, возможно, следовало бы разделить одну таблицу с самоссылкой на таблицы для каждого StructureType, но это решение фактически было принято несколько лет назад, и теперь я переносу монолитное Webapp .NET Framework в .NETБазовая и микросервисная архитектура, но для продолжения работы требуется монолитное веб-приложение. Любая помощь очень ценится

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...