Я создаю ASP. NET Core 3.1 Web API с использованием OData v4.
Я только что сделал репозиторий GitHub здесь , содержащий все решение, даже проект базы данных с фиктивными данными.
Некоторые блоги помогли мне в этом:
Эксперимент с OData в ASP. NET Core 3.1
Наддув ASP. NET Core API с OData
Я успешно создал 3 базовых c конечных точки, к которым можно обращаться (страны, города и клиенты). Конечные точки страны и города работают должным образом, именно конечная точка клиента вызывает некоторые проблемы при расширении $.
Модель клиента выглядит следующим образом (обратите внимание, что в настоящее время я использую доменные объекты вместо DTO, потому что я хочу чтобы все сначала работало гладко, прежде чем проецировать их в DTO):
public abstract class AppEntity : IAppEntity
{
[Key]
public int Id { get; set; }
}
public class Customer : AppEntity
{
public string Name { get; set; }
public string AddressLine1 { get; set; }
public string AddressLine2 { get; set; }
public virtual City City { get; set; }
public string VAT { get; set; }
public virtual List<CustomerEmailAddress> EmailAddresses { get; set; }
public virtual List<CustomerNote> Notes { get; set; }
}
Со следующими моделями, действующими как свойства навигации:
public class CustomerEmailAddress : AppEntity
{
public Customer Customer { get; set; }
public string EmailAddress { get; set; }
public bool IsPrimary { get; set; }
}
public class CustomerNote : AppEntity
{
public Customer Customer { get; set; }
public DateTime DateTime { get; set; }
public string Message { get; set; }
}
Большинство моих запросов успешны:
- Только коллекция: https://localhost: 44309 / API / клиент
- Расширение города: https://localhost: 44309 / API / клиент ? $ expand = City
- В одном из множества отношений: https://localhost: 44309 / api / customer ? $ expand = Примечания
Но как только я пытаюсь развернуть 2 или более одно-много свойств или развернуть все (? $ expand = *), я получаю исключение:
System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection. (Parameter 'index')
Любая подсказка, откуда может исходить это исключение?
Моя EdmModel определяется как:
IEdmModel GetEdmModel()
{
var odataBuilder = new ODataConventionModelBuilder();
odataBuilder.EntitySet<Country>("Country");
odataBuilder.EntitySet<City>("City");
odataBuilder.EntitySet<Customer>("Customer");
return odataBuilder.GetEdmModel();
}