Я настроил OData в своем приложении и могу выполнять базовые c операции с моделью WeatherForecast. Однако, когда я пытаюсь получить запрос по свойству Address, это дает исключение ниже в подходах №1 и №2, а в подходе №3 я могу запросить свойство Address.
Сообщение об исключении: " Запрос, указанный в URI, недействителен. Не разрешается вкладывать параметры запроса в выбранные «Адреса». "
В чем разница между подходом EdmModel и подходом, отличным от Edm-модели? Для регистрации в Edm обязательно наличие свойства id модели. Кроме того, это выдает ошибку, если модель не имеет свойства id.
$ exception {"Набор сущностей WeatherForecast основан на типе WeatherAPI.WeatherForecast, для которого не определены ключи."} System.InvalidOperationException
Подходы
#1
endpoints.EnableDependencyInjection();
endpoints.Select().Filter().OrderBy().Count().MaxTop(null);
endpoints.MapODataRoute("odata", null, GetEdmModel());
#2
var builder = new ODataConventionModelBuilder();
endpoints.EnableDependencyInjection();
endpoints.Select().Filter().OrderBy().Count().MaxTop(null);
endpoints.MapODataRoute("odata", null, builder.GetEdmModel());
#3
endpoints.Select().Filter().OrderBy().Count().MaxTop(null);
endpoints.EnableDependencyInjection(b =>
{
b.AddService(Microsoft.OData.ServiceLifetime.Singleton, typeof(IEdmModel), sp => GetEdmModel());
});
GetEdmModel
public static IEdmModel GetEdmModel()
{
var builder = new ODataConventionModelBuilder();
builder.EntitySet<WeatherForecast>("WeatherForecast");
return builder.GetEdmModel();
}
Классы моделей
public class WeatherForecast
{
public Guid Id { get; set; }
public DateTime Date { get; set; }
public int TemperatureC { get; set; }
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
public string Summary { get; set; }
public Address Addresses { get; set; }
}
public class Address
{
public string StreetId { get; set; }
public string StreetName { get; set; }
}