Я хотел бы настроить. 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));