Ассоциация [значения] не найдена при использовании Simple.OData.Client - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть служба OData, настроенная с помощью IModelConfiguration

public void Apply(ODataModelBuilder builder, ApiVersion apiVersion)
{
     builder.EntitySet<ValuesContainer>("ValuesContainer");
     builder.AddComplexType(typeof(ValueItem));
}

, которая производит следующие (обфусцированные и выбранные соответствующие части) метаданные:

<Edmx xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx" Version="4.0">
    <DataServices>
        <Schema xmlns="http://docs.oasis-open.org/odata/ns/edm" Namespace="MyProject.Api.Models">
            <EntityType Name="ValuesContainer">
                <Key>
                    <PropertyRef Name="id" />
                </Key>
                <Property Name="values" Type="Collection(MyProject.Api.Models.ValueItem)" />
                <Property Name="id" Type="Edm.Guid" Nullable="false" />
            </EntityType>
            <ComplexType Name="ValueItem">
                <Property Name="value" Type="Edm.String" />
                <Property Name="id" Type="Edm.Guid" Nullable="false" />
            </ComplexType>
        </Schema>
   </DataServices>
</Edmx>

В основном у меня есть тип сущности ValuesContainer , который имеет коллекцию сложного типа ValueItem .

Следующий пример работает нормально, когда я пытаюсь запросить службу через http get:

~ / odata / valuescontainer? $ Filter = values ​​/ any (v: v / value eq ' example ')

Этот пример дает мне любой ValuesContainer , который имеет значение, содержащее пример.

Тем не менее, когда я использую Simple.OData.Client в другом C# приложении, я получаю ошибку Simple.OData.Client.UnresolvableObjectException: 'Association [values] not найдено '

Код моего Simple.OData.Client:

var httpClient = _httpClientFactory.CreateClient();
var odataClientSettings = new ODataClientSettings(httpClient)
{
    BaseUri = new Uri($"{_myEndPointConfig.BaseUrl}/odata/")
};
var entries = await new ODataClient(odataClientSettings).For<ValuesContainer>("ValuesContainer")
                .Filter(x => x.Values.Any(v => v.value == "example").FindEntriesAsync().ConfigureAwait(false);

Я пытался отследить его через Fiddler, был ли запрос плохим, но это происходит где-то между получением метаданные сервиса OData и обработки выражения.

Я заметил, что в следующем месте выдается исключение

namespace Simple.OData.Client.V4.Adapter
{
    public class Metadata : MetadataBase {
    ...
        private IEdmNavigationProperty GetNavigationProperty(string collectionName, string propertyName)
        {
            var property = GetEntityType(collectionName).NavigationProperties()
                .BestMatch(x => x.Name, propertyName, NameMatchResolver);

            if (property == null)
                // obviously being thrown here
                throw new UnresolvableObjectException(propertyName, $"Association [{propertyName}] not found");

            return property;
        }
    ...
    }
}

Он пытается получить мою собственность Значения как NavigationProperty , но это не так не один.

Не верны ли мои метаданные и, следовательно, конфигурация моей службы OData и почему она работает через вызов get http, или это неправильное поведение Simple.OData.Client?

1 Ответ

0 голосов
/ 12 февраля 2020

Очевидно, что в Simple.OData.Client есть ошибка, которая требует, чтобы коллекции имели NavigationProperty , что неверно.

https://github.com/simple-odata-client/Simple.OData.Client/issues/274

...