Конфигурация OData в формате. NET Core 3.1 - PullRequest
0 голосов
/ 07 мая 2020

Я настроил 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; }
}

1 Ответ

1 голос
/ 07 мая 2020

Как выглядит ваш файл DBContext?

Entity Framework необходимо знать, какой из них является вашим ключом, и я предполагаю, что эта часть здесь отсутствует. Хотя по умолчанию EF выбирает идентификатор свойства, так как это Guid, мы будем безопаснее указывать его.

Попробуйте изменить модель WeatherForecast на что-то вроде:

public class WeatherForecast
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    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; }
}

Если хотите чтобы узнать больше, посмотрите эти ответы:
- Generate Guid on Server Side ,
- EF 6 guid в качестве первичного ключа: невозможно вставить значение null в идентификатор столбца

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