Абстрактная функция возврата OData - PullRequest
0 голосов
/ 07 марта 2020

Я хотел бы настроить. NET Core 2.2 проект с OData Controller, который может выполнять операцию GET через функцию, где возвращаемое значение имеет свойство типа, которое наследуется от абстрактного класса.

При попытке запустить этот проект я получаю сообщение об ошибке во время запуска, поскольку производная сущность уже настроена.

Вот различные классы важности.

public class SearchResponse {
    public IEnumerable<SearchResult> ResultSet { get; set; }
}

public abstract class SearchResult {
    public DateTime? LastViewedTimestamp { get; set; }
}

public class SolrResultDocument
    : SearchResult {

    public virtual string Id { get; set; }

    public override double? Score { get; set; }

}

Вот конфигурация модели и инициализация запуска.

public class IncidentModelConfiguration :
    IModelConfiguration {
        public void Apply(ODataModelBuilder builder, ApiVersion apiVersion) {
            builder.EntityType<Incident>()
                .Collection
                .Function("Search")
                .Returns<string>(); // this is the piece I'd like to change to be SearchResponse instead
        }
}

public class Startup {
    public void Configure(IApplicationBuilder app, VersionedODataModelBuilder modelBuilder, IApiVersionDescriptionProvider provider) {
        app.UseMvc(routeBuilder => {
            routeBuilder.SetTimeZoneInfo(TimeZoneInfo.Utc);
            routeBuilder.MapVersionedODataRoutes("odata", "api/v{version:apiVersion}", modelBuilder.GetEdmModels());
        });
    }
}

И мой контроллер

[ApiVersion("1.0")]
public class IncidentsController :
    ODataController {

    [HttpGet()]
    [Produces("application/json")]
    [ProducesResponseType(Status200OK)]
    public ActionResult<SearchResponse> Search(SearchRequest request) {
        return this.Ok(this._manager.GetIncidentSearchResponse(request));
    }

}

Когда я устанавливаю ModelConfiguration для возврата строки, мой контроллер работает нормально, но если Я пытаюсь установить конфигурацию как правильное возвращаемое значение (в этом случае SearchResponse) я получаю следующее исключение.

System.InvalidOperationException: 'The entity type 'SearchResult' cannot be configured as a complex type because the derived type 'SolrResultDocument' is already configured as an entity type.'

Как я могу сказать функции, чтобы она возвращала правильный тип данных? Я уже пробовал множество различных вспомогательных методов на сборщике, но безуспешно. Некоторые примеры перечислены ниже.

builder.AddComplexType(typeof(SearchResponse));
builder.RemoveStructuralType(typeof(SolrResultDocument));
var conventionBuilder = new ODataConventionModelBuilder();
conventionBuilder.Ignore(typeof(SolrResultDocument));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...